[javascript] JavaScript에서 여러 줄 문자열 만들기

Ruby에는 다음 코드가 있습니다. 이 코드를 JavaScript로 변환하고 싶습니다. JS의 동등한 코드는 무엇입니까?

text = <<"HERE"
This
Is
A
Multiline
String
HERE



답변

최신 정보:

ECMAScript 6 (ES6)에는 새로운 유형의 리터럴, 즉 템플릿 리터럴이 도입되었습니다 . 그것들은 다른 많은 것들과 다양한 보간법을 가지고 있지만, 가장 중요한 것은이 질문에 대해 여러 줄이 될 수 있습니다.

템플릿 리터럴은 백틱 으로 구분됩니다 .

var html = `
  <div>
    <span>Some HTML here</span>
  </div>
`;

(참고 : 문자열에서 HTML을 사용하는 것을 옹호하지 않습니다)

브라우저 지원은 가능 하지만 트랜스 파일러 를 사용 하여 호환성을 높일 수 있습니다.


원래 ES5 답변 :

Javascript에는 here-document 구문이 없습니다. 그러나 리터럴 개행을 피할 수 있습니다.

"foo \
bar"


답변

ES6 업데이트 :

첫 번째 답변에서 언급했듯이 ES6 / Babel을 사용하면 백틱을 사용하여 여러 줄 문자열을 만들 수 있습니다.

const htmlString = `Say hello to
multi-line
strings!`;

보간 변수는 백틱으로 구분 된 문자열과 함께 제공되는 인기있는 새로운 기능입니다.

const htmlString = `${user.name} liked your post about strings`;

이것은 단지 연결로 변환됩니다.

user.name + ' liked your post about strings'

원래 ES5 답변 :

Google의 JavaScript 스타일 가이드 는 줄 바꿈을 피하는 대신 문자열 연결을 사용하는 것이 좋습니다.

이 작업을 수행하지 마십시오 :

var myString = 'A rather long string of English text, an error message \
                actually that just keeps going and going -- an error \
                message to make the Energizer bunny blush (right through \
                those Schwarzenegger shades)! Where was I? Oh yes, \
                you\'ve got an error and all the extraneous whitespace is \
                just gravy.  Have a nice day.';

각 줄의 시작 부분에있는 공백은 컴파일 타임에 안전하게 제거 할 수 없습니다. 슬래시 뒤에 공백이 있으면 까다로운 오류가 발생합니다. 대부분의 스크립트 엔진이이를 지원하지만 ECMAScript의 일부는 아닙니다.

대신 문자열 연결을 사용하십시오.

var myString = 'A rather long string of English text, an error message ' +
               'actually that just keeps going and going -- an error ' +
               'message to make the Energizer bunny blush (right through ' +
               'those Schwarzenegger shades)! Where was I? Oh yes, ' +
               'you\'ve got an error and all the extraneous whitespace is ' +
               'just gravy.  Have a nice day.';

답변

패턴 text = <<"HERE" This Is A Multiline String HEREjs 사용할 수 없습니다 (좋은 펄 시절에 많이 사용하는 것을 기억합니다).

복잡하거나 긴 여러 줄 문자열을 감독하기 위해 때때로 배열 패턴을 사용합니다.

var myString =
   ['<div id="someId">',
    'some content<br />',
    '<a href="#someRef">someRefTxt</a>',
    '</div>'
   ].join('\n');

또는 익명으로 이미 표시된 패턴 (줄 바꿈 이스케이프)은 코드에서 못생긴 블록 일 수 있습니다.

    var myString =
       '<div id="someId"> \
some content<br /> \
<a href="#someRef">someRefTxt</a> \
</div>';

또 다른 이상하지만 작동하는 ‘트릭’ 1이 있습니다 .

var myString = (function () {/*
   <div id="someId">
     some content<br />
     <a href="#someRef">someRefTxt</a>
    </div>
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

외부 편집 : jsfiddle

ES20xx템플릿 문자열을 사용하여 여러 줄에 걸친 문자열을 지원합니다 .

let str = `This is a text
    with multiple lines.
    Escapes are interpreted,
    \n is a newline.`;
let str = String.raw`This is a text
    with multiple lines.
    Escapes are not interpreted,
    \n is not a newline.`;

1 참고 : 코드 축소 / 난독 화 후에는 손실됩니다


답변

당신 은 할있습니다순수한 JavaScript로 여러 줄 문자열을 가질 .

이 방법은 구현에 따라 정의 된 함수의 직렬화를 기반으로합니다 . 대부분의 브라우저에서 작동하지만 (아래 참조) 앞으로도 계속 작동 할 것이라는 보장이 없으므로 의존하지 마십시오.

다음 기능 사용 :

function hereDoc(f) {
  return f.toString().
      replace(/^[^\/]+\/\*!?/, '').
      replace(/\*\/[^\/]+$/, '');
}

다음과 같은 문서를 가질 수 있습니다.

var tennysonQuote = hereDoc(function() {/*!
  Theirs not to make reply,
  Theirs not to reason why,
  Theirs but to do and die
*/});

이 방법은 다음 브라우저에서 성공적으로 테스트되었습니다 (언급되지 않음 = 테스트되지 않음).

  • IE 4-10
  • 오페라 9.50-12 (9가 아님)
  • Safari 4-6 (3 아님)
  • 크롬 1-45
  • Firefox 17-21 ( 16-이 아닌 )
  • Rekonq 0.7.0-0.8.0
  • Konqueror 4.7.4에서 지원되지 않습니다

그래도 축소기를 조심하십시오. 주석을 제거하는 경향이 있습니다. 를 들어 YUI 압축기 , 코멘트로 시작/*! 보존됩니다 (내가 사용하는 것과 같은).

실제 해결책은 CoffeeScript 를 사용하는 것이라고 생각합니다 .

ES6 업데이트 : 주석이있는 함수를 만들고 주석에서 toString을 실행하는 대신 backtick를 사용할 수 있습니다. 공간을 제거하기 위해 정규식을 업데이트해야합니다. 이를 위해 문자열 프로토 타입 방법을 사용할 수도 있습니다.

let foo = `
  bar loves cake
  baz loves beer
  beer loves people
`.removeIndentation()

멋지다. 누군가이 .removeIndentation 문자열 메소드를 작성해야합니다 …;)


답변

당신은 이것을 할 수 있습니다 …

var string = 'This is\n' +
'a multiline\n' +
'string';


답변

나는 다중 줄 문자열의이 지 미식 리깅 방법을 생각해 냈습니다. 함수를 문자열로 변환하면 함수 내부의 주석도 반환되므로 여러 줄 주석 / ** /를 사용하여 주석을 문자열로 사용할 수 있습니다. 끝을 다듬어야하고 줄이 있습니다.

var myString = function(){/*
    This is some
    awesome multi-lined
    string using a comment
    inside a function
    returned as a string.
    Enjoy the jimmy rigged code.
*/}.toString().slice(14,-3)

alert(myString)


답변

나는 그것을 보지 못한 것에 놀랐다. 왜냐하면 그것이 테스트 한 모든 곳에서 작동하기 때문에 템플릿과 같이 매우 유용하다.

<script type="bogus" id="multi">
    My
    multiline
    string
</script>
<script>
    alert($('#multi').html());
</script>

HTML이 있지만 작동하지 않는 환경을 아는 사람이 있습니까?