자바 스크립트 문자열에 변수를 어떻게 넣습니까? (Node.js)


147
s = 'hello %s, how are you doing' % (my_name)

그것이 파이썬에서하는 방법입니다. javascript / node.js에서 어떻게 할 수 있습니까?


1
나는 어딘가에 es-next strawman이 있다고 확신한다var s = 'hello ${my_name}, how are you doing';
Raynos

1
Raynos가 말한대로 사용합니다 : const poem = "Black river"; const author = "Joseph Troll"; const favePoem =`내가 가장 좋아하는시는 $ {author} \ {poem}입니다 .`; 또는 다음을 사용할 수 있습니다. console.log ( '% s is % d.', 'Eleven', 11);
Gilberto B. Terra Jr.

답변:


56

비슷한 것을 원한다면 함수를 만들 수 있습니다.

function parse(str) {
    var args = [].slice.call(arguments, 1),
        i = 0;

    return str.replace(/%s/g, () => args[i++]);
}

용법:

s = parse('hello %s, how are you doing', my_name);

이것은 간단한 예일 뿐이며 다양한 데이터 유형 (예 %i: 등) 또는 이스케이프 처리를 고려하지 않습니다 %s. 그러나 나는 그것이 당신에게 아이디어를 줄 수 있기를 바랍니다. 나는 이와 같은 기능을 제공하는 라이브러리도 있다고 확신합니다.


1
파이썬에서와 같이 언어가 직접 지원하지 않기 때문에 기본적으로 가장 좋습니다.
Jim Schubert

util.format () 기능을 가진 다른 대답은 받아 들일만한 대답이어야하지만 ES6의 템플릿 문자열 (2011 년에는 존재하지 않았 음)을 언급하는 것이 바람직합니다. 우리는 실제로 오래된 질문을 위키 하이재킹하여 업데이트 할 수 있어야합니다. : \
Kyle Baker

1
@FelixKling, 당신은 받아 들여지는 대답이므로 다른 올바른 사용법을 지적하기 위해 자신의 대답을 업데이트 할 수 있습니까?
Kyle Baker

1
이것은 훌륭합니다. 템플릿 리터럴은 정확히 같지 않습니다.
Thevangelist

"인수"를 사용하는 동안 문제가 발생했습니다. 여러 클라이언트가 구문 분석을 통과하면 "str"이 혼합되었습니다. 어떤 설명?
tspentzas

406

Node.js v4를 사용하면 ES6의 템플릿 문자열을 사용할 수 있습니다

var my_name = 'John';
var s = `hello ${my_name}, how are you doing`;
console.log(s); // prints hello John, how are you doing

문자열 ` 대신 백틱으로 줄 바꿈해야합니다.'


1
Plus 1 2017 년에 ES6이 기본적으로 노드 세계에서 표준이기 때문에.
Jankapunkt

1
이것은 이제 (2017) 정답입니다. 구형 브라우저를 지원하려면 툴체인에 Babel이 필요합니다.
superluminary

3
node.js 개발자에게 nodejs.org/api/readline.html 과 같은 페이지 에서 백틱 이라는 것을 분명히하는 것이 실제로 유용 할 것이라고 제안했습니다 . 여기에 문제가있었습니다 : github.com/nodejs/docs/issues/55
Gail Foad

의견에 감사드립니다;)
Overdrivr

3
문자열이 구성 파일의 일부이고 구성 hello ${my_name}, how are you doing에서 문자열을 읽은 후 변수를 동적으로 할당하려면 어떻게해야합니까?
Amreesh Tyagi


43

현재 node.js >4.0문자열 조작이 크게 개선 된 ES6 표준과 더욱 호환됩니다.

대답은 원래의 질문은 간단하게 할 수 있습니다 :

var s = `hello ${my_name}, how are you doing`;
// note: tilt ` instead of single quote '

문자열이 여러 줄로 퍼질 수있는 경우 템플릿 또는 HTML / XML 프로세스를 매우 쉽게 만듭니다. 자세한 내용과 추가 기능 : 템플릿 리터럴은 mozilla.org의 문자열 리터럴 입니다.


3
"작은 따옴표 대신`
Mario Binder


14

그렇게:

s = 'hello ' + my_name + ', how are you doing'

최신 정보

ES6을 사용하면 다음을 수행 할 수도 있습니다.

s = `hello ${my_name}, how are you doing`

"불가능하다"는 무슨 뜻입니까? :? 텍스트 형식을 지정하려면 Felix Kling의 설명에 따라 텍스트를 작성하십시오. 이것은 내가 볼 수있는 가장 좋은 대답입니다.;) :)
Merianos Nikos

@TIMEX 시도해 보는 것이 가능합니다.
dev_khan

5

String.prototypeES2015 템플릿 리터럴 을 확장 하거나 사용 하는 몇 가지 방법 .

var result = document.querySelector('#result');
// -----------------------------------------------------------------------------------
// Classic
String.prototype.format = String.prototype.format ||
  function () {
    var args = Array.prototype.slice.call(arguments);
    var replacer = function (a){return args[a.substr(1)-1];};
    return this.replace(/(\$\d+)/gm, replacer)
};
result.textContent = 
  'hello $1, $2'.format('[world]', '[how are you?]');

// ES2015#1
'use strict'
String.prototype.format2 = String.prototype.format2 ||
  function(...merge) { return this.replace(/\$\d+/g, r => merge[r.slice(1)-1]); };
result.textContent += '\nHi there $1, $2'.format2('[sir]', '[I\'m fine, thnx]');

// ES2015#2: template literal
var merge = ['[good]', '[know]'];
result.textContent += `\nOk, ${merge[0]} to ${merge[1]}`;
<pre id="result"></pre>



3

node.js를 사용하는 경우 console.log () 는 형식 문자열을 첫 번째 매개 변수로 사용합니다.

 console.log('count: %d', count);

이것은 좋은 지적이지만 문제는 문자열 보간에 관한 것입니다. console.log()형식화 된 문자열 만로 출력합니다 STDOUT. 즉, 다음 결과를 사용할 수 없습니다count: %d
Jim Schubert

3

const format = (...args) => args.shift().replace(/%([jsd])/g, x => x === '%j' ? JSON.stringify(args.shift()) : args.shift())

const name = 'Csaba'
const formatted = format('Hi %s, today is %s and your data is %j', name, Date(), {data: {country: 'Hungary', city: 'Budapest'}})

console.log(formatted)


3

문제를 정확하게 해결 하는 함수 를 작성했습니다 .

첫 번째 인수 는 매개 변수화하려는 문자열입니다. 이 문자열에 변수 "% s1, % s2, ... % s12" 와 같은 변수를 넣어야합니다 .

다른 인수 는 해당 문자열에 대한 매개 변수입니다.

/***
 * @example parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
 * @return "my name is John and surname is Doe"
 *
 * @firstArgument {String} like "my name is %s1 and surname is %s2"
 * @otherArguments {String | Number}
 * @returns {String}
 */
const parameterizedString = (...args) => {
  const str = args[0];
  const params = args.filter((arg, index) => index !== 0);
  if (!str) return "";
  return str.replace(/%s[0-9]+/g, matchedStr => {
    const variableIndex = matchedStr.replace("%s", "") - 1;
    return params[variableIndex];
  });
}

parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
// returns "my name is John and surname is Doe"

parameterizedString("this%s1 %s2 %s3", " method", "sooo", "goood");
// returns "this method sooo goood"

해당 문자열에서 변수 위치가 변경되면이 함수는 함수 매개 변수를 변경하지 않고이를 지원합니다.

parameterizedString("i have %s2 %s1 and %s4 %s3.", "books", 5, "pencils", "6");
// returns "i have 5 books and 6 pencils."

2
var user = "your name";
var s = 'hello ' + user + ', how are you doing';

나는 그것에 몇 가지 문제가 있다고 본다. 코드 검토를 수행 할 때 일반적으로 읽고 유지하기가 더 어려우므로 문자열 형식 대신 연결을 사용합니다. 또한 해당 "패턴"을 검색 시스템 (예 : 구성 파일 또는 DB)에 안전하게 저장하고 나중에 사용자의 가치를 주입 할 수 없습니다.
Rory Browne

1

다음은 Node.js 의 여러 줄 문자열 리터럴 예제입니다.

> let name = 'Fred'
> tm = `Dear ${name},
... This is to inform you, ${name}, that you are
... IN VIOLATION of Penal Code 64.302-4.
... Surrender yourself IMMEDIATELY!
... THIS MEANS YOU, ${name}!!!
...
... `
'Dear Fred,\nThis is to inform you, Fred, that you are\nIN VIOLATION of Penal Code 64.302-4.\nSurrender yourself IMMEDIATELY!\nTHIS MEANS YOU, Fred!!!\n\n'
console.log(tm)
Dear Fred,
This is to inform you, Fred, that you are
IN VIOLATION of Penal Code 64.302-4.
Surrender yourself IMMEDIATELY!
THIS MEANS YOU, Fred!!!


undefined
>

이것을 템플릿 문자열 이라고 부르며, 기존의 답변을지지
Bergi

내가 보여준이 "템플릿 문자열"예제는 IS에 여러 줄 문자열 리터럴을 사용하는 "템플릿 문자열"입니다.
사랑과 평화-Joe Codeswell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.