「前端开发」 -

JS-ES6-03

ECMAScript6 —— 数值的扩展

Posted by eliochiu on November 8, 2022

二进制、八进制表示

ES5在严格模式中已经不允许八进制使用0开头,eS6新增了二进制和八进制的字面量表示法:0b(0B)0o(0O)

1
2
0b1110 === 14 // true
0o71 === 57 // true

如果想将0b, 0o前缀的字符串转成十进制数值,可以使用Number()方法:

1
2
Number('0b1110') // 14
Number('0o71') // 57

Number.isFinite()、Number.isNaN()

ES6在Number对象上新提供了两个方法Number.isFinite()、Number.isNaN()

Number.isFinite()

Number.isFinite()用于检测一个数值是否为有限的:

1
2
3
4
5
6
7
8
Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // fasle
Number.isFinite(infinity); // fasle
Number.isFinite(-infinity); // fasle
Number.isFinite('foo'); // fasle
Number.isFinite('15'); // fasle
Number.isFinite(true); // fasle

ES5可以通过下面的代码部署该方法:

1
2
3
4
5
6
7
8
9
10
11
12
(function (global) {
  var global_isFinite = global.isFinite;

  Object.defineProperty(Number, 'isFinite', { 
    value: function isFinite(value) {
      return typeof value === 'number' && global_isFinite(value);
      },
    configurable: true, 
    enumerable: false, 
    writable: true
    });
})(this);

Number.isNaN()

Number.isNaN()方法用于判断一个值是否为NaN

1
2
3
4
5
6
7
Number.isNaN(NaN); // true
Number.isNaN(15); // false
Number.isNaN('15'); // false
Number.isNaN(true); // false
Number.isNaN(9 / NaN); // true
Number.isNaN('true' / 0); // true
Number.isNaN('true' / 'true'); // true

ES5可以通过下面的代码部署该方法:

1
2
3
4
5
6
7
8
9
10
11
12
(function (global) {
  var global_isNaN = global.isNaN;

  Object.defineProperty(Number, 'isNaN', { 
    value: function isFinite(value) {
      return typeof value === 'number' && global_isNaN(value);
      },
    configurable: true, 
    enumerable: false, 
    writable: true
    });
})(this);

两个新方法和全局方法的区别是,新方法只判断数值型的值。而传统方法会进行数值转换。

Number.parseInt()、Number.parseFloat()

ES6将全局的parseInt()parseFloat()移植到Number对象上,行为完全保持不变,目的是减少全局性方法。

Number.isInteger()

Number.isInteger()用于判断一个数是不是整数。特别注意的是,3和3.0在JavaScript里存储的方式是一致的,他们都是整数。

1
2
3
4
5
Number.isInteger(25); // true
Number.isInteger(25.0); // true
Number.isInteger(25.1); // false
Number.isInteger("15"); // false
Number.isInteger(true); // false

ES5可以通过以下代码部署该方法:

1
2
3
4
5
6
7
8
9
10
11
12
(function (global) {
  var global_isInteger = global.isInteger;

  Object.defineProperty(Number, 'isInteger', { 
    value: function isFinite(value) {
      return typeof value === 'number' && global_isInteger(value);
      },
    configurable: true, 
    enumerable: false, 
    writable: true
    });
})(this);

Number.EPSILON

ES6在Number对象上添加了一个极小增量EPSILON

1
Number.EPSILON; // 2.220446049250313e-16

引用这么小的量是为了浮点数运算时设置误差范围,如果误差比EPSILON小,我们可以认为得到了正确结果。

指数运算符

ES2016新增了指数运算符**

1
2
2 ** 3 === 8; // true
3 ** 2 === 9; // true

指数运算符可以和等号结合进行复合赋值。

1
a **= 2; // 等价a = a ** 2

BigInt数据类型

JavaScript所有数字都保存成64位浮点数,这决定了整数的精确程度只能到53个二进制位。大于这个范围的整数,JavaScript是无法精确表示的,这使得JavaScript不适合进行科学和金融方面的精确计算。

BigInt简介

ES6新增了BigInt数据类型,他是一种基本类型,只能用来表示整数,没有位数的限制,任何证书都可以精确地表示。为了和Number类型区别,BigInt类型的数字后面都要加一个n

1
1n + 2n = 3n

二进制、八进制、十进制表示法也要加上后缀n

1
2
3
0b0110n
0o721n
0x2b3an

对于BigInt类型的数据,typeof运算符会返回bigint

1
typeof 123n // "bigint"

JavaScript提供了原生对象BigInt,用来转换成BigInt类型的数值,转换规则和Number()一致。

1
2
3
4
BigInt(123); // 123n
BigInt('123'); // 123n
BigInt(false); // 0n
BigInt(true); // 1n

以下的用法会报错:

1
2
3
4
5
new BigInt() // 不存在完整的构造函数,不能使用`new`关键字
BigInt(undefined); 
BigInt(null); 
BigInt('123n'); 
BigInt('abc'); 

运算

数学方面,BigInt类型的+、-、*、**这四个二元运算符和Number类型一致。除法运算会舍去小数,返回一个整数:

1
9n / 5n = 1n