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

多行字符串中反斜杠后面的空格会中断JavaScript代码的执行,javascript,multilinestring,Javascript,Multilinestring,Chrome版本:版本57.0.2987.110(64位) 这就是我得到的错误:“未捕获的语法错误:无效或意外的令牌” 代码如下: var x = "\ "; 如果我删除反斜杠后面的空格,一切正常 为什么会发生这种情况?因为它是一个未终止的字符串文本 JavaScript解析器在未闭合的引号末尾使用反斜杠作为字符串的行继续。但是字符串中可以有反斜杠,所以如果反斜杠不是行的最后一个字符,解析器如何推断它意味着行的继续 例如: // this is legit var foo = "the pa

Chrome版本:版本57.0.2987.110(64位)

这就是我得到的错误:“
未捕获的语法错误:无效或意外的令牌

代码如下:

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中的多行字符串总是令人讨厌的。