多行字符串中反斜杠后面的空格会破坏JavaScript代码的执行

时间:2017-03-21 14:03:12

标签: javascript multilinestring

Chrome版本:版本57.0.2987.110(64位)

这是我得到的错误:" Uncaught SyntaxError: Invalid or unexpected token"。

这是代码:

var x = "\ 
";

如果我移除space后面的backslash,一切正常。

为什么会这样?

2 个答案:

答案 0 :(得分:4)

因为它是一个未终止的字符串文字。

JavaScript解析器在未闭合引号的末尾采用反斜杠作为字符串的行继续。但是你可以在字符串中使用反斜杠,所以如果反斜杠不是该行的最后一个字符,那么解析器应该如何推断它意味着一行继续?

例如:

// this is legit
var foo = "the path is C:\\Users\\bob";

// this too
var foo = "the path is \
C:\\Users\\bob";

// this is an error: unclosed quote, no continuation
var foo = "the path is C:\\Us
ers\\bob";

// your error case, altered slightly to clarify
var foo = "the path is\ C
:\\Users\\bob";

在错误情况下,解析器无法判断反斜杠不是文件路径的一部分,而是作为行继续:它不知道的文件路径是什么。它没有先验语言知识,它必须能够处理任意字符序列。它的空白无关紧要,解析器无法推断你的意思是将字符串继续到下一行。

这是一个常见的错误来源,因为您无法通过查看源代码来了解问题所在。作为一种不易出错的替代方案,您可以使用以下任何一种方法:

// concatenation
var foo = "the path is " +
  "C:\\Users\\bob";

// Array.prototype.join
var foo = [
  "the path is ",
  "C:\\Users\\bob"
].join("");

// ES 6 template strings, note that whitespace is preserved
let foo = `
  the path is
  C:\\Users\\bob
`;

答案 1 :(得分:2)

\字符用于将特殊字符转换为文字。

例如,\t将转换为制表符空间。在ECMAScript规范的paragraph 8.4末尾有一个特殊字符的引用。

正如上述规范中的说明所说,有一个值得注意的例外:newline字符。它不会转换为字面形式,而是基本上被跳过。可以把它想象成空字符串的转义序列。

"abc\ def" === "abcdef"

这有一个有趣的副作用,让你在多行上“格式化”你的字符串,纯粹是出于代码美学的目的。

根据您的具体情况

var x = "\ ";

将创建一个带有空格的字符串,后跟一个文字换行符,这不是有效的语法。

var x = "\ ";

将转义换行符并创建一个有效的空字符串。