阅读 165

字符串 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


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐