ES6(2)字符串和正则表达式

145 阅读3分钟
utf16码位

在UTF-16中,前2^16个码位均以16位的编码单元表示,这个范围被称为基本多文种平面(BMP)。超出这个范围的码位则要归属于某个辅助平面

let text = "𠮷"

image.png

image.png

image.png

  • 变量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()方法根据指定的码位生成一个字符 image.png

normalize()

可以提供Unicode的标准形式,如果开发国际化的应用,这个就有用的多了

正则表达式u修饰符

当一个正则表达式添加了u修饰符时,它就从编码单元操作模式切换为字符模式,如此一来正则表达式就不会视代理为两个字符,从而完全按照预期正常运行

let text = "𠮷"
console.log(text.length)  //2
console.log(/^.$/.test(text))  //false
console.log(/^.$/u.test(text))  //true

这方法尽管有用,但是当统计长字符串中的码位数量时,运行效率很低,当不兼容es6时需要判断是否支持u修饰符

字符串的子串识别
  1. includes()在字符串中检测到指定文本则返回true,否则返回false
  2. startsWith()在字符串起始位置检测到指定文本返回true,否则返回false
  3. endsWith()字符串结束部分检测到指定文本则返回true,否则返回false
  4. 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()