为什么 String.raw 不能以反斜杠结尾?

Lon*_*est 4 javascript node.js template-literals ecmascript-next

String.raw可用于创建包含反斜杠的字符串,而不必将这些反斜杠加倍。

从历史上看,您需要在创建字符串时将反斜杠加倍:

let str = "C:\\Program Files\\7-Zip";
console.log(str);
Run Code Online (Sandbox Code Playgroud)

String.raw 允许您的代码显示没有双反斜杠的路径:

let str = String.raw`C:\Program Files\7-Zip`;
console.log(str);
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,但今天我发现如果原始字符串以反斜杠结尾,它就不起作用:

let str = String.raw`Can't End Raw With Backslash\`;
console.log(str);
Run Code Online (Sandbox Code Playgroud)

上面的代码段产生了这个错误:

{
  "message": "SyntaxError: `` literal not terminated before end of script",
  "filename": "https://stacksnippets.net/js",
  "lineno": 14,
  "colno": 4
}
Run Code Online (Sandbox Code Playgroud)

为什么这是一个例外?

tad*_*man 5

它可以,但请记住,有“文字”字符和反斜杠字符。你要求一个字面的反引号。要求一个字面反斜杠:

let str = String.raw`...\\`;
Run Code Online (Sandbox Code Playgroud)

紧跟在反斜杠后面的任何字符都被视为其文字版本,无论它是什么。String.raw可以解决其中一些限制,但不是全部。它抑制了诸如\n但不能阻止您意外添加文字反引号之类的插值。

  • 这似乎不是一个正确的解决方案。`String.raw\`...\\\`` 给我 `"...\\\\"`,而不是 `"...\\"`。 (3认同)
  • 是的,我明白你的意思。这是一个耻辱; 到目前为止,我认为我已经找到了不必将这些反斜杠加倍的完美解决方案。太糟糕了,它有一个陷阱。 (2认同)
  • 我在之前的评论中跳过了一个逻辑步骤——OP的问题是关于如何创建一个以**单个**反斜杠结尾的字符串。您的答案确实表明“String.raw”可用于创建以 **两个** 反斜杠结尾的字符串,但乍一看,您似乎在说尾随反斜杠可以转义为 \\,所以`String.raw\`...\\\`` 将创建一个以一个反斜杠结尾的字符串。但事实并非如此,事实上据我所知,似乎没有任何方法可以用 String.raw 来做到这一点......除了 `String.raw\` ...${"\\ “}\`` (2认同)