如何将单个反斜杠放入 ES6 模板文字的输出中?

bra*_*ter 10 escaping node.js read-eval-print-loop ecmascript-6 template-literals

我正在努力获取 ES6 模板文字来生成单个反斜杠及其结果。

> `\s`
's'
> `\\s`
'\\s'
> `\\\s`
'\\s'
> `\\\\s`
'\\\\s'
> `\u005Cs`
'\\s'
Run Code Online (Sandbox Code Playgroud)

通过检查 Node REPL 上的值(而不是使用 打印它console.log) ,使用 Node 8.9.1 和 10.0.0 进行测试

Vic*_*tor 5

如果我答对了你的问题,怎么样\\

我尝试使用$ node -i并运行

console.log(`\\`);
Run Code Online (Sandbox Code Playgroud)

从而成功输出反斜杠。请记住,输出也可能被转义,因此知道您成功获得反斜杠的唯一方法是获取字符代码:

const myBackslash = `\\`;
console.log(myBackslash.charCodeAt(0)); // 92
Run Code Online (Sandbox Code Playgroud)

为了确保您实际上没有得到\\(即双反斜杠),请检查长度:

console.log(myBackslash.length); // 1
Run Code Online (Sandbox Code Playgroud)


Wik*_*żew 5

未知字符串转义序列在 JavaScript 普通字符串和模板字符串文字中丢失转义反斜杠是一个已知问题:

当字符串文字或正则表达式文字中的字符前面有反斜杠时,它将被解释为转义序列的一部分。例如,\n字符串文字中的转义序列对应于单个换行符,而不是\n 字符。但是,并非所有字符在转义序列中使用时都会改变含义。在这种情况下,反斜杠只是使该字符看起来有其他含义,而反斜杠实际上没有任何作用。例如,\k字符串文字中的转义序列仅表示k. 这种多余的转义序列通常是良性的,并且不会改变程序的行为。

在常规字符串文字中,需要加倍反斜杠才能引入文字反斜杠字符:

console.log("\s \\s"); // => s \s
console.log('\s \\s'); // => s \s
console.log(`\s \\s`); // => s \s
Run Code Online (Sandbox Code Playgroud)

有一个更好的想法:使用String.raw

静态方法是模板文字String.raw()的标记函数。这类似于Python 中的前缀或 C# 中字符串文字的前缀。(但它并不相同;请参阅本期中的解释。)它用于获取模板字符串的原始字符串形式,即处理替换(例如),但不处理转义(例如)。r@${foo}\n

因此,您可以简单地使用String.raw`\s`定义\s文本:

console.log(String.raw`s \s \\s`); // => s \s \\s
Run Code Online (Sandbox Code Playgroud)

  • `String.raw` 为我做到了,谢谢! (2认同)