这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战。
前言
ECMAScript 6.0 简称ES6 , 是 JavaScript 语言的新一代的标准,于在 2015 年 6 月发布,正式名称就是《ECMAScript 2015 标准》。一般情况,泛指, 5.1版以后的标准,涵盖了 ES2015、ES2016、ES2017、ES2018、ES2019、ES2020、ES2021 等等
我们一起来学习 ES6增强后的字符串吧:
- String.prototype.codePointAt
- String.prototype.normalize
String.prototype.codePointAt
获取码点。
这个和String.fromCodePoint方法是对应的, 来一个对照表,更好理解。
| 方法名 | 作用 | 方法类型 | 参数 |
|---|---|---|---|
| String.fromCodePoint | 根据码点获取字符串 | 静态方法 | 多个码点 |
| String.prototype.codePointAt | 获取码点 | 原型方法(实例方法) | 索引值 |
ES5有另外一个方法String.prototype.charCodeAt,其只能正确的识别码点小于 0xFFFF的字符。 这个大家想一下, 如果要进行polyfill,应该怎么做。 答案吗,当然是基于charCodeAt。
一起看看例子:
var text = "𠀴a";
console.log(text.codePointAt(0)) // 131124
console.log(text.codePointAt(1)) // 56372
console.log(text.codePointAt(2)) // 97
这里codePointAt(0)和codePointAt(2)都好理解,这个codePointAt(1)的值为啥是这样的呢?
这里实际上只有两个字符,却能codePointAt(2),能找三个值,有写意思吧。
- 当字符码点小于 0xFFFF的时候,直接返回码点
- 当字符码点大于 0xFFFF的时候
符�之谜里有详细讲解,码点大于0xFFFF的时候,是采用四个字节来保存的。codePointAt(0)返回真实的码点值codePointAt(1)返回低位2个字节的值, 其等于charCodeAt
我们一起验证一下:
var text = "𠀴";
console.log(text.codePointAt(0)) // 131124
console.log(text.codePointAt(1)) // 56372
console.log(text.charCodeAt(0)) // 55360
console.log(text.charCodeAt(1)) // 56372
如果是要遍历字符串,请参见 字符串的遍历.
String.prototype.normalize
按照指定的一种 Unicode 正规形式将当前字符串正规化。 这个玩意作为中国人确实没啥用,对欧美的字符有些用, 大致了解即可,知道有这么回事。
语法:
str.normalize([form])
form 可选(参见软大神的normalize)
NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。(这只是用来举例,normalize方法不能识别中文。)NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。
看个例子来理解吧,这么看文字太枯燥。
\u006E的字符是n,\u0303的字符是̃ , 连接起来\u006E\u0303是ñ。
\u00F1也能表示 ñ。
在视觉和语义上看起来是一致的。 直接比较肯定不相同,通过normonize就不一样了。
const string1 = '\u00F1';
const string2_1 = '\u006E';
const string2_2 = '\u0303';
const string2 = '\u006E\u0303';
console.log(string1); // ñ
console.log(string2_1); // n
console.log(string2_2); // ̃
console.log(string2); // ñ
string1 == sting2 // false
string1.normalize() == string1.normalize() // true
小结
今天你收获了吗?