数值的扩展
1.二进制和八进制表示法
ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)
和0o(或0O)
表示
1.1Number.isFinite(), Number.isNaN()
ES6 在Number
对象上,新提供了Number.isFinite()
和Number.isNaN()
两个方法。
Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity。
Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite('15'); // false
Number.isFinite(true); // false
注意,如果参数类型不是数值
,Number.isFinite
一律返回false。
Number.isNaN()
用来检查一个值是否为NaN
。
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
如果参数类型不是NaN
,Number.isNaN
一律返回false
。
它们与传统的全局方法
isFinite()
和isNaN()
的区别在于,传统方法先调用
Number()将非数值的值转为数值,再进行判断
,而这两个新方法只对数值有效
,Number.isFinite()对于非数值一律返回false
, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false
。
isFinite(25) // true
isFinite("25") // true
Number.isFinite(25) // true
Number.isFinite("25") // false
isNaN(NaN) // true
isNaN("NaN") // true
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false
Number.isNaN(1) // false
1.2Number.parseInt(), Number.parseFloat()
- ES6 将全局方法
parseInt()
和parseFloat()
,移植到Number对象
上面,行为完全保持不变。 - 这样做的目的,是逐步减少全局性方法,使得
语言逐步模块化
。
// ES5的写法
parseInt('12.34') // 12
parseFloat('123.45#') // 123.45
// ES6的写法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45
Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true
1.3Number.isInteger()
Number.isInteger()
用来判断一个数值是否为整数。
Number.isInteger(25) // true
Number.isInteger(25.1) // false
JavaScript 内部,整数
和浮点数
采用的是同样的储存方法,所以 25 和 25.0 被视为同一个值。
如果参数不是数值
,Number.isInteger
返回false
。
Number.isInteger() // false
Number.isInteger(null) // false
Number.isInteger('15') // false
Number.isInteger(true) // false
注意,由于 JavaScript 采用 IEEE 754 标准,数值存储为64位双精度格式,数值精度最多可以达到 53 个二进制位(1 个隐藏位与 52 个有效位)。如果数值的精度超过这个限度,第54位及后面的位就会被丢弃
,这种情况下,Number.isInteger可能会误判
。
Number.isInteger(3.0000000000000002) // true
总之,如果对数据精度的要求较高,不建议使用Number.isInteger()
判断一个数值是否为整数。
2.Math 对象的扩展
1.判断两个值是否完全相等 === Object.is
console.log(Object.is(100,100)); //true
console.log(Object.is(100,200)); //false
console.log(Object.is(NaN,NaN)); //true
console.log(NaN === NaN); //false
2.Object.assign
对象的合并
var obj1 = {
a : 1,
b : 2
}
var obj2 = {
c : 1,
d : 2
}
let newObj = Object.assign(obj1,obj2);
console.log(newObj); // {a: 1, b: 2, c: 1, d: 2}
3.直接修改 __proto__
设置原型
var obj1 = {
a: 1,
b: 2
}
var obj2 = {
c: 1,
d: 2
}
obj1.__proto__ = obj2;
console.dir(obj1);