为什么 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字符来覆盖这一点,因此可以添加额外的字符以显示在结果字符串中。
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字符来覆盖这一点,因此可以添加额外的字符以显示在结果字符串中。