6.4 字符串遍历

字符串是可遍历的,也就是说可以使用 for-of 遍历字符串中的字符:

for (const ch of 'abc') {
    console.log(ch);
}
// Output:
// a
// b
// c

也可以使用扩展操作符(...)将字符串转换成数组:

const chars = [...'abc'];
    // ['a', 'b', 'c']

6.4.1 字符串遍历遵循 Unicode 码点规则

字符串遍历的时候,分割字符串是按照码点边界来的,这意味着遍历的时候拿到的字符可能由一个或者两个 JavaScript 字符组成:

for (const ch of 'x\uD83D\uDE80y') {
    console.log(ch.length);
}
// Output:
// 1
// 2
// 1

6.4.2 计算码点数

遍历是一种快速计算字符串 Unicode 码点数的方式:

> [...'x\uD83D\uDE80y'].length
3

6.4.3 翻转包含非 BMP 码点的字符串

利用遍历也能够实现翻转包含非 BMP 码点(比16位大,用两个 JavaScript 字符编码)的字符串:

const str = 'x\uD83D\uDE80y';

// ES5: \uD83D\uDE80 are (incorrectly) reversed
console.log(str.split('').reverse().join(''));
    // 'y\uDE80\uD83Dx'

// ES6: order of \uD83D\uDE80 is preserved
console.log([...str].reverse().join(''));
    // 'y\uD83D\uDE80x'

在火狐浏览器中的翻转结果:

遗留问题:合并标记 一个合并标记就是两个 Unicode 码点的序列,用于展示单个符号。我在这里展示的 ES6 翻转非 BMP 码点的方法,不适用于合并标记。对于合并标记的翻转,你需要一个库,例如 Mathias Bynens 的 Esrever

results matching ""

    No results matching ""