字符串是一种重要的数据类型,而正则表达式则是赋予了编程人员更多操作字符串的能力。ES6的创作者为字符串和正则表达式添加了许多的新功能。下面玲珑将来进行一个全面的总结。
字符串和正则两个部分各两节,全文阅读时间大约10分钟
字符串
1.更好的Unicode支持
Unicode是一个字符集。将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了。
在es6出现之前,js字符串一直基于16位字符编码进行构建。每16位序列是一个编码单元,代表一个字符,Unicode0引入扩展字符集,16位字符编码将不再包含任何字符。编码规则也因此变更。
对于UTF-16来说,码位可以有多个编码单元表示,是表示不是组成。
对于UTF-16前2^16个码位都是16位的编码单元表示,这个范围被称作基本多文种平面BMP,当超过时,引入代理对,规定用两个16位编码单元表示一个码位,即32位辅助平面字符。一个32位代理对表示字符长度为1,但是length属性值为2.
如果想进一步了解他可以参考阮一峰的一片日志: … 日志里面说到的码点就是码位
1.1codePointAt(0)方法
在es6之前,charCodeAt()方法返回字符每个16位编码单元对应的数值,再在es6中新增了codePointAt方法,codePointAt(0)返回的是位置0处的码点或者说是位置0处的码位,包含多个编码单元>16进制上限FFFF,charCodeAt(0)方法返回的是位置0的第一个编码单元.
因此可以用此方法判断一个字符占用编码单元的数量
function is32Bit(c) { return c.codePointAt(0) > 0xFFFF; } console.log(is32Bit("吉利")); //true console.log(is32Bit("a")); //false
1.2 String.fromCodePoint()方法
codePointAt()方法在字符串中检索一个字符串的码位,也可以使用String.fromCodePoint()方法根据指定的码位生成一个字
console.log(String.fromCodePoint(134071)); //吉
1.3normalize()方法
在比较字符或者进行排序的时候,可能出现等价的情况,然而等价却存在两种情况
规范的等效是无论从哪个角度来看,两个序列的码位都是没有区别的
兼容的码位序列看起来不同,但是在特定的情况下可以交换使用。 但是在严格模式下不是等效的,除非通过某些方法把这种等效关系标准化
normalize()方法提供Unicode的标准化形式,,这个方法可以接受一个可选的字符串参数。Unicode标准化形式有四种
以标准等价方式分解,然后以标准等价方式重组(“NFC”),默认值选项
以标准等价方式分解(“NFD”)
以兼容等价方式分解(“NFKC”)
以兼容方式分解,然后以标准等价方式重组
1.4 正则表达式u修饰符
正则表达式后添加u修饰符会将编码单元模式切换成字符模式,这个时候的代理对不会被视为两个字符。
但是length这个属性返回的仍然是字符串编码单元的数量,而不是码位的数量。但是也可以通过带u修饰符的正则表达式来解决这个问题。
function codePointerLength(text) { let result = text.match(/[\s\S]/gu); return result ? result.length:0; } console.log(codePointerLength("吉abc")); //4
检测是否支持u修饰符
u修饰符在不兼容ES6的JavaScript引擎中使用会导致语法错误,可以通过以下函数检测是否支持。
function hasRegExpU() { try{ var pattern = new Regexp(".","u"); return ture; }catch (ex) { return false; } }
2.其他字符串的变更
2.1字符串中的字串识别
开发者们用indexOf()方法在一段字符串中检测另一段子字符串。在es6中提供3个方法达到类似的效果
startWith()方法,在字符串起始部分检测指定文本返回true,否则返回false。
incledes()方法,如果在字符串中检测到指定文本返回true,否则返回false。
endWith()方法,顾名思义在末尾检测,用法与上面一致。
上面三个方法接受两个参数,第1个参数是指定要搜索的文本是一个字符。第2个是开始搜索位置的索引值是一个数字。不指定第二个参数endwith一般从字符串末尾处开始匹配。示范如下
let mes = "hello world"; console.log(mes.startWith("hello")); console.log(mes.endWith("!")); console.log(mes.includes("o")); console.log(mes.startWith("o")); console.log(mes.endWith("d!")); console.log(mes.includes("x")); console.log(mes.startWith("o",4)); console.log(mes.endWith("o",8)); console.log(mes.includes("o",8)); //9个结果依次为:true true true false true false true true false console.log(mes.endWith("o",8));会从第7位第二个o开始匹配。索引值-要搜索文本的长度=8-1
2.2 repeat()方法
es6为字符串新增加的repeat()方法,接受一个number类型的参数,返回重复该次数的一个新字符串。
console.log(x.repeat(3)); //"xxx"
我是2条分割线,嘎嘎嘎
正则表达式
1.其他正则表达式的变更
1.1正则表达式y修饰符
y修饰符粘滞正则表达式,从正则表达式的lastIndex属性开始进行。如果指定位置没有匹配成功那么将停止匹配并返回结果。