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

Why can't String.raw end with a backslash?

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

过去,创建字符串时需要加倍反斜杠:

let str = "C:\Program Files\7-Zip";
console.log(str);

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

let str = String.raw`C:\Program Files-Zip`;
console.log(str);

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

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

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

{
  "message": "SyntaxError: `` literal not terminated before end of script",
  "filename": "https://stacksnippets.net/js",
  "lineno": 14,
  "colno": 4
}

为什么这是个例外?

更新: 另一个反斜杠不符合我要求的例子是:

let str1 = "folder";
let str2 = "subfolder";
let fileName = "file.txt"
let path = String.raw`${str1}${str2}${fileName}`;
console.log(path);

虽然我希望得到这个输出:

\folder\subfolder\file.txt

而是输出:

${str1}${str2}${fileName}

反斜杠转义了美元符号的特殊含义。所以,这是另一种情况,你仍然需要加倍那些反斜杠:(

可以,但请记住,有 "literal" 字符和反斜杠字符。您要求 文字 反引号。请求文字反斜杠:

let str = String.raw`...\`;

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

结尾 \` 总是被解析为转义的 ` 符号,这意味着模板文字没有匹配的结束反引号。这使得反斜杠与 String.raw.

的使用方式不太一致

对于更多的特殊情况,可以根据需要用字符串中不会出现的字符填充字符串。

可以换行:

const trimmedLine = (...args) => String.raw(...args).replace(/^(?:\r?\n|)([\s\S]*?)(?:\r?\n|)$/, '')

// "C:\Program Files-Zip\"
trimmedLine`
C:\Program Files-Zip\
`

一个space:

const trimmedSpace = (...args) => String.raw(...args).replace(/^([\s\S]*?) ?$/, '')

trimmedSpace`C:\Program Files-Zip\ `  // "C:\Program Files-Zip\" with no space
trimmedSpace`C:\Program Files-Zip\  ` // "C:\Program Files-Zip\ " with 1 space

以此类推

即使不应修剪字符串,助手也可以通过恰好删除一个白色space字符来覆盖这一点,因此可以添加额外的字符以显示在结果字符串中。