扩展
字符串的扩展
- 字符的 Unicode 表示法
将码点放入大括号:"\u{41}\u{42}\u{43}"
- 字符串的遍历器接口
ES6 为字符串添加了遍历器接口,使得字符串可以被for…of循环遍历。 - JavaScript 规定有5个字符,不能在字符串里面直接使用,只能使用转义形式
U+005C:反斜杠(reverse solidus)
U+000D:回车(carriage return)
U+2028:行分隔符(line separator)
U+2029:段分隔符(paragraph separator)
U+000A:换行符(line feed)
- JSON.stringify() 的改造
如果遇到0xD800到0xDFFF之间的单个码点,或者不存在的配对形式,它会返回转义字符串,留给应用自己决定下一步的处理。 - 模板字符串
模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。 - 标签模板
它可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。
字符串的新增方法
- String.fromCodePoint()
从 Unicode 码点返回对应字符,并且可以识别大于0xFFFF的字符。 - String.raw()
返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法。 - 实例方法:codePointAt()
能够正确处理 4 个字节储存的字符,返回一个字符的码点。 - 实例方法:normalize()
用来将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化。 - 实例方法:includes(), startsWith(), endsWith()
includes():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
- 实例方法:repeat()
repeat方法返回一个新字符串,表示将原字符串重复n次。 - 实例方法:padStart(),padEnd()
如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全 - 实例方法:trimStart(),trimEnd()
trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。 - 实例方法:matchAll()
matchAll()方法返回一个正则表达式在当前字符串的所有匹配 - 实例方法:replaceAll()
可以一次性替换所有匹配。它的用法与replace()相同,返回一个新字符串,不会改变原字符串。
正则的扩展
-
RegExp构造函数
如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。 -
字符串的正则方法
String.prototype.match 调用 RegExp.prototype[Symbol.match]
String.prototype.replace 调用 RegExp.prototype[Symbol.replace]
String.prototype.search 调用 RegExp.prototype[Symbol.search]
String.prototype.split 调用 RegExp.prototype[Symbol.split]
- u 修饰符
点字符:点(.)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符。
Unicode 字符表示法:ES6 新增了使用大括号表示 Unicode 字符,这种表示法在正则表达式中必须加上u修饰符,才能识别当中的大括号,否则会被解读为量词。
量词:使用u修饰符后,所有量词都会正确识别码点大于0xFFFF的 Unicode 字符。
预定义模式:u修饰符也影响到预定义模式,能否正确识别码点大于0xFFFF的 Unicode 字符。
i 修饰符:有些 Unicode 字符的编码不同,但是字型很相近,比如,\u004B与\u212A都是大写的K。
转义:没有u修饰符的情况下,正则中没有定义的转义(如逗号的转义,)无效,而在u模式会报错。 - RegExp.prototype.unicode 属性
正则实例对象新增unicode属性,表示是否设置了u修饰符。 - y 修饰符
y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始。 - RegExp.prototype.sticky 属性
与y修饰符相匹配,ES6 的正则实例对象多了sticky属性,表示是否设置了y修饰符。 - RegExp.prototype.flags 属性
ES6 为正则表达式新增了flags属性,会返回正则表达式的修饰符。 - s 修饰符:dotAll 模式
ES2018 引入s修饰符,使得.可以匹配任意单个字符。/foo.bar/s.test('foo\nbar') // true
这被称为dotAll模式,即点(dot)代表一切字符。所以,正则表达式还引入了一个dotAll属性,返回一个布尔值,表示该正则表达式是否处在dotAll模式。 - 后行断言
x只有在y后面才匹配,必须写成/(?<=y)x/
- Unicode 属性类
引入了一种新的类的写法\p{…}和\P{…},允许正则表达式匹配符合 Unicode 某种属性的所有字符。 - 具名组匹配
引入了具名组匹配(Named Capture Groups),允许为每一个组匹配指定一个名字,既便于阅读代码,又便于引用。 - 正则匹配索引
`const text = 'zabbcdef';
const re = /ab/;
const result = re.exec(text);
result.index // 1
result.indices // [ [1, 3] ]`
exec()方法的返回结果result,它的index属性是整个匹配结果(ab)的开始位置,而它的indices属性是一个数组,成员是每个匹配的开始位置和结束位置的数组。由于该例子的正则表达式没有组匹配,所以indices数组只有一个成员,表示整个匹配的开始位置是1,结束位置是3。
13. String.prototype.matchAll()
ES2020 增加了String.prototype.matchAll()方法,可以一次性取出所有匹配。不过,它返回的是一个遍历器(Iterator),而不是数组。
数值的扩展
- 二进制和八进制表示法
ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。 - Number.isFinite(), Number.isNaN()
Number.isFinite()用来检查一个数值是否为有限的(finite),Number.isNaN()用来检查一个值是否为NaN。 - Number.parseInt(), Number.parseFloat()
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。 - Number.isInteger()
Number.isInteger()用来判断一个数值是否为整数。 - Number.EPSILON
ES6 在Number对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。 - 安全整数和 Number.isSafeInteger()
JavaScript 能够准确表示的整数范围在-253到253之间(不含两个端点),超过这个范围,无法精确表示这个值。 - Math 对象的扩展
Math.trunc():用于去除一个数的小数部分,返回整数部分。
Math.sign() :Math.sign方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。
Math.cbrt():Math.cbrt()方法用于计算一个数的立方根。
Math.clz32() :Math.clz32()方法将参数转为 32 位无符号整数的形式,然后返回这个 32 位值里面有多少个前导 0。
Math.imul() :Math.imul方法返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数。
Math.fround() :Math.fround方法返回一个数的32位单精度浮点数形式。
Math.hypot():Math.hypot方法返回所有参数的平方和的平方根。 - 指数运算符
ES2016 新增了一个指数运算符(**)。 - BigInt 数据类型
BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。