字符串 String.fromCodePoint和String.raw
前言
ECMAScript 6.0 简称ES6 , 是 JavaScript 语言的新一代的标准,于在 2015 年 6 月发布,正式名称就是《ECMAScript 2015 标准》。一般情况,泛指, 5.1版以后的标准,涵盖了 ES2015、ES2016、ES2017、ES2018、ES2019、ES2020、ES2021 等等
我们一起来ES6字符串的两个静态方法:
String.fromCodePoint
String.raw
String.fromCodePoint
根据输入的Unicode码点返回对应字符。
String.fromCodePoint(0x61, 0x20034) // 'a????' 复制代码
ES5其实有一个极其类似的方法, String.fromCharCode
, 不过并不能识别码点大于0xFFFF
(十进制:65535)码点。
String.fromCharCode(0x61, 0x20034) // 'a4' 复制代码
当然这是不正确的,String.fromCharCode
识别码点大于0xFFFFF
的时,是直接去掉高位。 所以上面的方等于:
String.fromCharCode(0x61, 0x0034) // 'a4' String.fromCharCode(0x61, 0x20034) == String.fromCharCode(0x61, 0x0034) // true 复制代码
当然,我们还有更加简洁的初始化方法:
var text = "\u0061\u{20034}" console.log(text); // 'a????' 复制代码
这里需要额外注意一下,就是码点大于 0xFFFF的字符时,格式是 \u{xxxxx}
, 有大括弧。 小于0xFFFF的就可有可无了。
'\u{20034}' // '????' '\u{0061}' // 'a' '\u0061' // 'a' 复制代码
与String.fromCharCode对应的方式,是 String.prototype.codePointAt, 一个是静态方法,一个是原型上的方法,即实例方法。
var text = String.fromCodePoint(0x61, 0x20034) ; text.length // 3 text[0] // 'a' text[1] // '\uD840' text[2] // '\uDC34' text.codePointAt(0); // 'a' text.codePointAt(1); // '????' 复制代码
至于text[0]
, text[1]
的输出是这样, 可以参见字符串的遍历
String.raw
获取一个模板字符串的原始字符串的,比如说,占位符(例如 ${foo}
)会被处理为它所代表的其他字符串,而转义字符(例如 \n
)不会。
语法有两种:
String.raw(callSite, ...substitutions)
String.raw`templateString`
先看一个简单MDNString.raw
的例子:
`Hi\n${2+3}!` // 'Hi\n5!' String.raw`Hi\n${2+3}!` // 'Hi\n5!' String.raw `Hi\u000A!` // 'Hi\u000A!' `Hi\u000A!` // 'Hi\n!' 复制代码
可以看到,${}
计算部分被执行,而其他的部分被保留原样输出。
其另外一种语法:
String.raw(callSite, ...substitutions)
callSite
一个模板字符串的“调用点对象”。类似{ raw: ['foo', 'bar', 'baz'] }
。...substitutions
任意个可选的参数,表示任意个内插表达式对应的值。
看起来比较空洞,看一个例子:
String.raw({ raw: ['foo', 'bar', 'baz'] }, 2 + 3, 'Java' + 'Script'); //等同于`foo${2 + 3}bar${'Java' + 'Script'}baz` 复制代码
raw走一位,然后,substitutions的走一位。就这么简单。
如果,substitutions的长度不够长会怎嘛用呢,当然是直接跳过,进入下一循环。
String.raw({ raw: ['foo', 'bar', 'baz'] }) // 'foobarbaz' 复制代码
反过来, raw的长度不够呢?
String.raw({ raw: ['foo'] }, 2 + 3, 'Java' + 'Script') // 'foo' 复制代码
结果是,停止往下走,一单raw走完,over!!!
这里比较特殊的是字符串:
String.raw({ raw: 'ABCD' }, 0, 1, 2) // 'A0B1C2D' 复制代码
其实也很好理解,对吧,取下标吗!
我们再换类数组, 也是可以的,那么 arguments参数也是可以的。
String.raw({ raw: { length: 2 , 0: "A", 1: "B" }}, 0) // 'A0B' 复制代码
我们再试试把类数组的length去掉,发现不可以了,真有些意思。
String.raw({ raw: { 0: "A", 1: "B" }}, 0) // '' 复制代码
留一个问题,如果实现了迭代器的对象,能不能被正确解析呢?
作者:一花的生活
链接:https://juejin.cn/post/7030969498505052168