多行字符串中反斜杠后面的空格会中断JavaScript代码的执行
Chrome版本:版本57.0.2987.110(64位) 这就是我得到的错误:“多行字符串中反斜杠后面的空格会中断JavaScript代码的执行,javascript,multilinestring,Javascript,Multilinestring,Chrome版本:版本57.0.2987.110(64位) 这就是我得到的错误:“未捕获的语法错误:无效或意外的令牌” 代码如下: var x = "\ "; 如果我删除反斜杠后面的空格,一切正常 为什么会发生这种情况?因为它是一个未终止的字符串文本 JavaScript解析器在未闭合的引号末尾使用反斜杠作为字符串的行继续。但是字符串中可以有反斜杠,所以如果反斜杠不是行的最后一个字符,解析器如何推断它意味着行的继续 例如: // this is legit var foo = "the pa
未捕获的语法错误:无效或意外的令牌
”
代码如下:
var x = "\
";
如果我删除反斜杠
后面的空格
,一切正常
为什么会发生这种情况?因为它是一个未终止的字符串文本 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
`;
因为它是一个未终止的字符串文本 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
将转换为选项卡空间。ECMAScript规范末尾有一个关于特殊字符的参考
正如上述规范中的注释所述,有一个显著的例外:换行符
字符。它不会转换为文本形式,而是基本上被跳过。将其视为空字符串的转义序列
“abc\
def“=”abcdef“
这有一个有趣的副作用,即允许您在多行上“格式化”字符串,纯粹出于代码美学的目的
在你的特殊情况下
var x=“\
";代码>
将创建一个字符串,其中空格后跟文字换行符,这不是有效的语法
var x=”\
";代码>
将转义换行符并创建一个有效的空字符串。字符用于将特殊字符转换为文字
例如,\t
将转换为选项卡空间。ECMAScript规范末尾有一个关于特殊字符的参考
正如上述规范中的注释所述,有一个显著的例外:换行符
字符。它不会转换为文本形式,而是基本上被跳过。将其视为空字符串的转义序列
“abc\
def“=”abcdef“
这有一个有趣的副作用,即允许您在多行上“格式化”字符串,纯粹出于代码美学的目的
在你的特殊情况下
var x=“\
";代码>
将创建一个字符串,其中空格后跟文字换行符,这不是有效的语法
var x=”\
";代码>
将转义换行符并创建一个有效的空字符串。正确。解释器认为您试图逃离空格,而不是继续行。正确。解释器认为您试图转义空格而不是换行。如果在反斜杠后删除空格,反斜杠将转义换行符,因此使此JS有效,但转义换行符将永远消失。如果希望字符串包含换行符,则必须使用\n
添加一个换行符。这通常会导致这种模式“\n”。在引入多行字符串之前,JS中的多行字符串总是令人讨厌的。如果在反斜杠后面删除空格,反斜杠将转义换行符,因此使此JS有效,但转义换行符将永远消失。如果希望字符串包含换行符,则必须使用\n
添加一个换行符。这通常会导致这种模式“\n”。在引入多行字符串之前,JS中的多行字符串总是令人讨厌的。