utf16码位
在UTF-16中,前2^16个码位均以16位的编码单元表示,这个范围被称为基本多文种平面(BMP)。超出这个范围的码位则要归属于某个辅助平面
let text = "𠮷"
- 变量text的长度事实上是1,但它的length属性值却为2
- 变量text被判为两个字符,因此匹配单一字符的正则表达式会失效
- 前后俩个16位的编码单元都不表示任何可打印的字符,因此charAt()方法不会返回合法的字符串
- charCodeAt()方法同样不能正确的识别字符,它会放回每个16位编码单元对应的数值,在ECMAScript5中,是得到最接近text的真实值了
codePointAt()
ECMAScript6新增了完全支持UTF-16的codePointAt()方法
let text = "𠮷a"
console.log(text.charCodeAt(0)) //55362
console.log(text.charCodeAt(1)) //57271
console.log(text.charCodeAt(2)) //97
console.log(text.codePointAt(0)) //134071
console.log(text.codePointAt(1)) //57271
console.log(text.codePointAt(2)) //97
String.fromCodePoint()
ECMAScript通常会面向同一个操作提供正反两种方法,你可以使用codePointAt()方法在字符串中检索一个字符的码位,也可以使用String.fromCodePoint()方法根据指定的码位生成一个字符
normalize()
可以提供Unicode的标准形式,如果开发国际化的应用,这个就有用的多了
正则表达式u修饰符
当一个正则表达式添加了u修饰符时,它就从编码单元操作模式切换为字符模式,如此一来正则表达式就不会视代理为两个字符,从而完全按照预期正常运行
let text = "𠮷"
console.log(text.length) //2
console.log(/^.$/.test(text)) //false
console.log(/^.$/u.test(text)) //true
这方法尽管有用,但是当统计长字符串中的码位数量时,运行效率很低,当不兼容es6时需要判断是否支持u修饰符
字符串的子串识别
- includes()在字符串中检测到指定文本则返回true,否则返回false
- startsWith()在字符串起始位置检测到指定文本返回true,否则返回false
- endsWith()字符串结束部分检测到指定文本则返回true,否则返回false
- repeat()接受一个number类型,表示该字符串的重复次数
正则表达式y修饰符
y修饰符和g修饰符是类似的,都是全局匹配,但是有一定的要求
let str = "aaa_aa_aaaa"
let reg_g = /a+/g
let reg_y = /a+/y
reg_g.exec(str)
// aaa
reg_y.exec(str)
// aaa
reg_g.exec(str)
// aa
reg_y.exec(str)
// null
let str = "_aaa_aa_aaaa"
let reg_y = /a+/y
reg_y.lastIndex = 1
reg_y.exec(str)
// aaa
reg_y.lastIndex = 5
reg_y.exec(str)
// aa
reg_y.lastIndex = 8
reg_y.exec(str)
// aaaaa
总结:y修饰符可以进行全局匹配,且必须从当前匹配的起始位置开始匹配并且匹配成功,否则退出匹配
正则表达式的复制
var reg1 = /ab/i,reg2 = new Reg(reg1,'g') (在ES5中跑出错误,ES6正常运行)
console.log(reg1.toString()) //“/ab/i”
console.log(reg2.toString()) //“/ab/g”
flag属性
let re = /ab/g
console.log(re.source) //"ab"
console.log(re.flag) //"g"
标签模版
标签是你可以用函数解析模版字符串
在模版字面量中使用原始值
String.raw()