Chrome版本:版本57.0.2987.110(64位)
这是我得到的错误:" Uncaught SyntaxError: Invalid or unexpected token
"。
这是代码:
var x = "\
";
如果我移除space
后面的backslash
,一切正常。
为什么会这样?
答案 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 = "\
";
将转义换行符并创建一个有效的空字符串。