ES6 随记(3.2)-- 正则的拓展 & 数值的拓展

上一章请见:

1. ES6 随记(1)-- let 与 const

2. ES6 随记(2)-- 解构赋值

3. ES6 随记(3.1)-- 字符串的拓展

 

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 入门

posted on 2017-04-14 17:44  永恒的浪荡时光  阅读(278)  评论(0编辑  收藏  举报

导航