参考答案

大家看到题目,可能首先想到的是 str.length 获取字符串的长度。

其实 JS 中的字符串长度是个奇怪的设定,很多编程语言,获取字符串的长度是得到字节长度,比如一个正常的汉字是两个字节,但在 js 中,'汉'.length 是 1 。看上去很方便,殊不知,这个特性埋下的坑。

比如:

😀 : '😀'.length 得到的是 2
𠮷 : '𠮷''.length 得到的也是 2

ES6 里添加了一个东西叫字符串迭代器,还添加了一个东西叫 unicode 正则模式,它们也不能直接统计字符数,而是可以把字符串拆成一个字符的数组,你可以间接的计算出字符个数。

使用字符串的Iterator统计长度,如下例子:

const testStr = '123 ' for(let c of testStr) { console.log(c) } // 1 // 2 // 3 // console.log([...testStr].length) // 4

使用 Array.from 替换,并且封装一下:

function unicodeLength(str) { return Array.from(str).length }