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

时间:2018-04-25 16:07:14

标签: node.js ecmascript-6 escaping read-eval-print-loop template-literals

我很难获得一个ES6模板文字以产生一个反斜杠。

> `\s`
's'
> `\\s`
'\\s'
> `\\\s`
'\\s'
> `\\\\s`
'\\\\s'
> `\u005Cs`
'\\s'

通过检查节点REPL上的值(而不是使用console.log打印它)来测试节点8.9.1和10.0.0

2 个答案:

答案 0 :(得分:2)

如果我的问题是对的,\\怎么样?

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

console.log(`\\`);

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

const myBackslash = `\\`;
console.log(myBackslash.charCodeAt(0)); // 92

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

console.log(myBackslash.length); // 1

答案 1 :(得分:0)

这是一个已知的问题,unknown string escape sequences在JavaScript常规和模板字符串文字中丢失了转义的反斜杠:

当字符串文字或正则表达式文字中的字符为 以反斜杠开头,它被解释为转义的一部分 顺序。例如,字符串文字中的转义序列\n 对应一个换行符,而不是\n 字符。但是,并非所有字符都会在 转义序列。在这种情况下,反斜杠只是使角色 似乎意味着其他,反斜杠实际上没有 影响。例如,字符串文字中的转义序列\k仅 表示k。这种多余的转义序列通常是良性的,并且 不会改变程序的行为。

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

console.log("\s \\s"); // => s \s
console.log('\s \\s'); // => s \s
console.log(`\s \\s`); // => s \s

有一个更好的主意:使用 String.raw

静态 String.raw() 方法是template literals的标记功能。这类似于Python中的r前缀或@ C#中的前缀,用于字符串文字。 (但这不是相同;请参见 this issue中的说明。)它用于获取原始字符串形式 模板字符串,即替换(例如${foo})是 已处理,但转义符(例如\n)未被处理。

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

console.log(String.raw`s \s \\s`); // => s \s \\s