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 = "\
";
将转义换行符并创建一个有效的空字符串。
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 = "\
";
将转义换行符并创建一个有效的空字符串。