Space 多行字符串中反斜杠后面会中断 JavaScript 代码执行

Space behind a backslash in a multiline string breaks the JavaScript code execution

Chrome 版本:版本 57.0.2987.110(64 位)

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

这是代码:

var x = "\ 
";

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

为什么会这样?

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

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
`;

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

例如 \t 将转换为制表符 space。在 ECMAScript 规范的 paragraph 8.4 末尾有一个关于特殊字符的参考。

正如上述规范中的注释所说,有一个值得注意的例外:newline 字符。它不会转换为其文字形式,而是基本上被跳过。将其视为空字符串的转义序列。

"abc\ def" === "abcdef"

这有一个有趣的副作用,就是让您 "format" 您的字符串多行,纯粹是为了代码美观。


在您的具体情况下

var x = "\ ";

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

var x = "\ ";

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