如何用标准JavaScript代码重实现String.raw()?解析转义难题
如何用标准JavaScript重实现String.raw()?
你说得没错,自定义模板字面量标签函数直接拿第一个参数的字符串数组的话,拿到的是已经转义后的内容,这时候靠反转义来还原原始字符串根本不可靠——比如换行符到底是来自代码里的\n转义,还是直接敲的回车,转义后结果完全一样,没法区分。
但其实ECMAScript给标签函数的第一个参数提供了一个**.raw属性**,这个属性里保存的就是未经过转义的原始字符串片段数组,这正是重实现String.raw()的关键。
重实现代码示例
const myStringRaw = (strings, ...values) => { let output = ''; // 遍历原始字符串片段和对应的插值变量 for (let i = 0; i < strings.raw.length; i++) { // 先拼接当前原始字符串片段 output += strings.raw[i]; // 如果还有插值变量,就拼接上(最后一个片段后没有变量) if (i < values.length) { output += values[i]; } } return output; };
验证效果
- 调用
myStringRawa\nb``,会返回字符串'a\\nb'(也就是代码里写的原始a\nb,保留反斜杠和n) - 调用
myStringRawa
b``,会返回字符串'a\nb'(实际包含换行符,和直接输入的回车对应)
这个实现完全遵循了String.raw()的语义,因为它直接使用了引擎提供的原始字符串信息,不需要做任何不可靠的转义反转操作。
内容的提问来源于stack exchange,提问作者timkay
相关产品推荐
相关产品推荐

