当ES6遇上字符串和正则表达式

字符串是一种重要的数据类型,而正则表达式则是赋予了编程人员更多操作字符串的能力。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属性开始进行。如果指定位置没有匹配成功那么将停止匹配并返回结果。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjxjsj.html