読者です 読者をやめる 読者になる 読者になる

JavaScriptの文字列リテラルで「バックスラッシュ+改行」してもいいのかも。

(追記 2008/1/23 19:30)
元の記事は、JavaScriptの文字列リテラルで「バックスラッシュ+改行」するのはよくない。」というタイトルでした。

ECMA-262 3rd editionで禁止だったのは間違いなさそうですが、id:nanto_viさんのコメントにあるとおり、4th editionに取り込まれる可能性が高いみたいです。適当書いてごめんなさい。

Backslash-newline in string

A common extension to ES3 syntax is to allow strings to be broken across several source lines by allowing a backslash character followed by a newline to read as nothing. ES4 standardizes this behavior.

というわけで、

※※※ ここから下の記事は最新の仕様の参考になりません。 ※※※
(追記ここまで)



ヒアドキュメントについて調べていて、「バックスラッシュ+改行」で文字列を複数行にわけられるというのを知った。

var str1 = "abc\
def\
ghi";

That's a back-compat feature. ECMAScript says that you can't continue string literals over more than one line, but we allow it as an extension to the standard.

「それは後方互換の機能だよ。ECMAScriptはダメって言ってるけど、ぼくら(Microsoft)は標準を拡張してるんだ。」で、この後に「extensionじゃなくviolationだろうが」という突っ込みが入る。


It's mentioned three times in ECMA-262, and each time it's stated as
forbidden:

   A line terminator cannot occur within any token, not even a
   string.
                     -- par. 1, sentence 4, 7.3 - Line Terminators

   Escape Sequence ::
     CharacterEscapeSequence
     0 [lookahead ∉ DecimalDigit]
     HexEscapeSequence
     UnicodeEscapeSequence

   CharacterEscapeSequence ::
     SingleEscapeCharacter
     NonEscapeCharacter

   NonEscapeCharacter ::
     SourceCharacter but not EscapeCharacter or LineTerminator

                     -- Syntax, 7.8.4 - String Literals
                        Repeated in Annex A - Grammar Summary

   A 'LineTerminator' character cannot appear in a string literal,
   even if preceded by a backslash \. The correct way to cause a
   line terminator character to be part of the string value of a
   string literal is to use an escape sequence such as \n or
   \u000A.
                     -- Note, (end of) 7.8.4 - String Literals 

ECMAScriptの仕様の中で3度も禁止されてるという話。


コメント欄参照。

表 2.1 に載っていない文字の直前にバックスラッシュを付けても無視されますが、この使用法は廃止予定であり、使用を避けるべきです。

無視されるのはバックスラッシュだけじゃないのでこれはちょっと違うかもしれないけど、いずれ使えなくなる可能性はあると思う。逆に標準に取り込まれる可能性は……無いだろうなー。


というわけで、よっぽどで無い限り使わないほうがいいと思う。