3-4字符串扩展
参考博客
https://www.cnblogs.com/-simon/p/5944387.html
1、Unicode表示法 2、遍历接口 3、模板字符串 4、新增方法(10个)
因为有的方法是提议阶段,所以需要导入补丁,babel-polyfill
对比不同的表示方法
ES5中
{console.log("a" ,'\u 0061') //打印 a,a 但是如果有两个字节的时候,也就是大于'oxFFFF'
console.log('s','\u20BB7') // s 口7 ,没有正常显示,超过了两个字节,也就是大于'oxFFFF'的时候,会解析成两个字符处理,前4后1.
}
ES6中:
{console.log('s','\u{20bb7}')};// s 𠮷 ,用大括号时候,正常打印,没有问题
对比1、charAt(),2、charCodeAt() 3、codePointAt() 4、formCharCode
ES5中:
{let s = '𠮷' ;
console.log('length' ,s.length) ; //length 2 因为码值大于2个字节,所以做2字符处理。两个字节一个字符。
console.log('0' ,s.charAt(0)) ;//0 乱码
console.log('1' ,s.charAt(1)) ;//1 乱码
console.log('at0' ,s.charCodeAt(0)) ;//at0 55362
console.log('at1' ,s.charCodeAt(1)) ;//at1 57271 这里取得是码值。
}
ES6中:
{let s1 = '𠮷a';
console.log(('length' ,s1.length) ;//3 𠮷长度为2,加一个a,所以为3
console.log(('code0' ,s1.codePointAt(0)) ;//code0 134071(这个是10进制,codePointAt是ES6中方法,会计算对应的4个字节码值,charCodeAt()只取2个字节 )
console.log(('code1' ,s1.codePointAt(1).toString(16)) ;//code1 20bb7 取1的时候,和ES5中charCodeAt方法一样,两个字节。
console.log(('code2' ,s1.codePointAt(2).toString(16)) ;//code2 97(就是a) 取1的时候,和ES5中charCodeAt方法一样,两个字节。
}
3、String.fromCodePoint()
ES5提供String.fromCharCode方法,用于从码点返回对应字符,但是这个方法不能识别32位的UTF-16字符(Unicode编号大于0xFFFF)。
String.fromCharCode(0x20BB7)// "ஷ"
上面代码中,String.fromCharCode不能识别大于0xFFFF的码点,所以0x20BB7就发生了溢出,最高位2被舍弃了,最后返回码点U+0BB7对应的字符,而不是码点U+20BB7对应的字符。
ES6提供了String.fromCodePoint方法,可以识别0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。
String.fromCodePoint(0x20BB7)// "𠮷"String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y'// true
上面代码中,如果String.fromCodePoint方法有多个参数,则它们会被合并成一个字符串返回。
注意,fromCodePoint方法定义在String对象上,而codePointAt方法定义在字符串的实例对象上。