【问题标题】:How do I put a single backslash into an ES6 template literal's output?如何将单个反斜杠放入 ES6 模板文字的输出中?
【发布时间】:2018-04-25 16:07:13
【问题描述】:

我正在努力获得一个 ES6 模板文字来生成一个反斜杠它的结果。

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

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

【问题讨论】:

  • 与所有其他字符串文字相同。 `\\` === "\\"。只是 REPL 表示让您感到困惑。

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


【解决方案1】:

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

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

console.log(`\\`);

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

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

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

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

【讨论】:

  • 认为 是 console.log 函数将第一个反斜杠解释为那里的转义字符,而不是模板文字......但我不确定这对我有用,因为我正在使用它在 SQL 语句中创建正则表达式(不要问为什么!)。
  • 我在一个节点 repl 上进行测试,只是评估这些模板字符串并查看结果值,而不是打印输出
  • 请记住,console.log 的输出或 REPL 的输出也会被转义。请看this example on Runkit
  • 啊哈!没想到 REPL 转义,就是这样!在结果上调用length 还表明它们实际上的长度与当你有多个连续的“字符”时显示的长度不同
  • 很高兴我能派上用场!
【解决方案2】:

unknown string escape sequences 在 JavaScript 普通和模板字符串文字中丢失转义反斜杠是一个已知问题:

当字符串文字或正则表达式文字中的字符是 前面有反斜杠,它被解释为转义的一部分 顺序。例如,字符串文字中的转义序列\n 对应于单个换行符,而不是 \n 人物。然而,并非所有字符在使用时都会改变含义 转义序列。在这种情况下,反斜杠只会使字符 似乎意味着别的东西,反斜杠实际上没有 影响。例如,字符串文字中的转义序列\k 表示k。这种多余的转义序列通常是良性的,并且确实 不改变程序的行为。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多