ES6 随记(3.2)-- 正则的拓展 & 数值的拓展
上一章请见:
4. 拓展
b. 正则的拓展
首先又是关于 UTF-16 的修正
· u 修饰符 -- Unicode模式。
正则可以添加 i(忽略大小写) 或者 g(可匹配多个) 这类修饰符,ES6 则提供了 u(进入 Unicode 模式) 这个修饰符。
// \uD83D\uDC2A 实为一个字符(但由于过长所以是两个字节),所以本不应该被单个字节判断为 true console.log(/^\uD83D/.test('\uD83D\uDC2A')); // true console.log(/^\uD83D/u.test('\uD83D\uDC2A')); // false // 同理,'𠮷' 为一个字符,所以应该被一个 . 可以直接替代,而不需用两个 console.log(/^.$/.test('𠮷')); // false console.log(/^.$/u.test('𠮷')); // true // ES6 中可在 Unicode 模式下使用 \u{} 形式代表某字符 console.log(/\u{61}/.test('a')); // false console.log(/\u{61}/u.test('a')); // true console.log(/\u{20BB7}/u.test('𠮷')); // true // 这样就和正则本来的代表数量的 {} 有些混淆,所以一定要加 u 修饰符哟 console.log(/\u{2}/.test('uuu')); // true console.log(/\u{2}/u.test('uuu')); // false
· y 修饰符 -- 从首位开始匹配
除了上述的 u 修饰符,ES6 还提供了 y 修饰符,也叫做“粘连”(sticky)修饰符。
var s = 'aaa_aa_a'; var r1 = /a+/g; var r2 = /a+/y; console.log(r1.exec(s)); // ["aaa"] console.log(r2.exec(s)); // ["aaa"] console.log(r1.exec(s)); // ["aa"] console.log(r2.exec(s)); // null
第一次匹配后,字符串还剩下 '_aa_a',但 y 修饰符必须从首位开始匹配,所以第二次未能匹配到。也就是说,y 修饰符自带 ^ 标志。
· s 修饰符 - dotAll 模式
它出现的目的只是为了让 \n 和 \r 也可以被 .(匹配任意单个字符) 标志匹配到
console.log(/0.z/.test('0\nz')); // false console.log(/0[^]z/.test('0\nz')); // true,以前的变通之法 console.log(/0.z/s.test('0\nz')); // true,但部分浏览器暂不支持
· 新属性
另外正则多了个 sticky 属性,设置了 y 修饰符的正则为 true,比如:console.log(/x/y.sticky); // 输出 true;
而新增的 flags 属性则返回正则的修饰符,比如:console.log(/x/gi.flags); // 输出 'gi';
· escape 方法
RegExp.escape 与 String.escape 不同的地方在于,正则版的转义可以直接作为正则:
var regex = new RegExp(RegExp.escape('(*.*)'), 'g');
· 后行断言
这个比较有意思,以前 (?=) 和 (?!) 标志用于匹配后面是否为该字段的情况,但唯独没有匹配前面字段的办法,因此有了 (?<=) 和 (?<!),不过这个还在提案中。
c. 数值的拓展
· 二进制和八进制
以往用 0 开头表示八进制,0x 开头表示十六进制,但 0 开头实在不是很好东西,所以现在用 0o 表示八进制,0b 表示二进制
· 强类型
isNaN 和 isFinite 本来是有这个方法的,但它会把传入的字符串也变成数字来进行判断,
因此 ES6 的 Number.isNaN 和 Number.isFinite 要更严谨,对带数字的字符串就不当作数字来判断了。
Number.isInteger 也是如此。
· 新增 Number.isInteger 方法
用以判断整数和浮点数。虽然 5 和 5.0 还是会被算作都是整数。
可能我还没遇上这种判断吧,感受不到它的意义。
· 引入误差常量 Number.EPSILON
以往 0.1 + 0.2 都不是 0.3,但现在可以用 Number.EPSILON 做个误差判断了
console.log((0.1+0.2)-0.3 < Number.EPSILON); // true
感觉还是 parseFloat((0.1+0.2).toFixed(2)) 比较好用
· 安全整数
安全整数的范围是 -2^53 到 2^53(2 的 53 次方),超出就会变成另一个数了。
所以在计算大型数字时,你需要 Number.isSafeInteger() 方法,以及 Number.MIN_SAFE_INTEGER / Number.MAX_SAFE_INTEGER 常量。
· Math 对象的拓展
新增了一堆的方法和常量,
Math.trunc 直接取整,去掉小数(有必要回忆一下了,Math.round 四舍五入,Math.ceil 去小数且为正数则+1,Math floor 去小数但为负则还-1)
Math.sign 判断是正是负还是零,返回 +1,-1, 0, -0 (返回的是 number 类型哈)
Math.cbrt 计算立方根
Math.fround 方法返回一个数的单精度浮点数形式,也就是 new Float32Array([x])[0];
Math.hypot 返回所有参数的平方和的平方根,比如求三角第三边
此时干笑两声,剩下的 13 个就装作没看过吧,您可以去原著中查看
· 指数运算符
也就是 Math.pow 的效果,如:console.log(2 ** 3); // 8
本文部分转载自 阮一峰 的 ECMAScript 6 入门