代码
let count = 0,
s = "𠮷a";
for(let i of s){
count ++;
console.log(i);
}
for...of 输出:𠮷 a
console.log(count);//2
console.log(s.length);//3
疑惑的地方
1、字符串s的length为3,循环次数是2次;我用for循环测试,循环次数是3
次。
2、for...of在循环中做了那些事情导致循环次数少了一次?
let count = 0,
s = "𠮷a";
for(let i of s){
count ++;
console.log(i);
}
for...of 输出:𠮷 a
console.log(count);//2
console.log(s.length);//3
1、字符串s的length为3,循环次数是2次;我用for循环测试,循环次数是3
次。
2、for...of在循环中做了那些事情导致循环次数少了一次?
for ... of
循环依赖于迭代器Iterator
的实现,和[..."𠮷a"].length === 2
的原理一样,这个可以参看阮一峰老师在ES6这本书中相关的章节:https://es6.ruanyifeng.com/#docs/string#%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E9%81%8D%E5%8E%86%E5%99%A8%E6%8E%A5%E5%8F%A3
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答5.2k 阅读✓ 已解决
1 回答3.4k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
Javascript 采用 Unicode字符集,在 UTF-16 之前使用的是 UCS-2 编码,该编码方法使用2个字节表示字符(基本平面字符)。
UTF-16 编码发布后,UCS-2 被整合进 UTF-16,基本平面字符仍用2个字节,辅助平面字符使用4个字节表示。
因此,Javascript 的字符操作函数在处理4个字节的字符时,会当成两个双字节的字符处理,从而无法返回正确的结果。
"𠮷" 的 UTF-16 编码是4个字节的
0xD842 DFB7
,而4个字节的字符不属于 UCS-2编码,javascript 会将其识别为U+D842
和U+DFB7
两个字符(在基本平面内,U+D800
到U+DFFF
是一个空段,不对应任何字符)ES6 增强了 Unicode 支持,可以识别4字节的字符。除了
for...of
,还有以下方法length
属性返回字符串中字符编码单元的数量,所以也可能与实际的字符数量不相同。想要返回字符串的正确长度,可以使用
Array.from(string).length