Number 对象
NaN 值的产生
将某些非数值强制转换为数值的时候,会得到 NaN;
0 除以 0 会返回 NaN —— 但是其他数除以 0 则不会返回 NaN;
Number(undefined) // NaN
Number('undefined') // NaN
Number('string') // NaN
Number({}) // NaN
Number('10,3') // NaN
Number('123ABC') // NaN
Number(new Date().toString()) // NaN
类型转换
在非构造器上下文中,也就是没有 new 操作符时,Number 可以类型转换的函数使用;
接收一个参数,并将这个参数转换为数字,如果参数无法被转换为数字,则返回 NaN;
Number('10') // 10
Number('hello') // NaN
Number('') // 0
Number() // 0
Number(undefined) // NaN
Number(null) // 0
移植全局方法
在 ES5 中,如 parseFloat、parseInt 等都是全局方法,在 ES6 中把处理数值的一些方法都移植到了 Number 对象上了;
在后面的小节中会对 Number 上的方法和全局的方法进行对比,看它们有什么不同,ES6 又解决了什么问题;
parseInt('123'); // 123
Number.parseInt('123'); // 123
二进制和八进制表示法
-
ES6 提供了二进制和八进制数值表示的新写法,分别用前缀 0b (或 0B) 和 0o (或 0O) 表示;
// es6 2进制 0B 开头 console.log('B',0B111110111); // 503 console.log('B',0b111110111); // 相同,0B 和 0b 都可以 // es6 8进制 0o 开头 console.log(0o767); // 503 console.log(0O767); // 相同,0o 和 0O 都可以
-
从 ES5 开始,在严格模式之中,八进制就不再允许使用前缀 0 表示,ES6 进一步明确,要使用前缀 0o 表示;
// 非严格模式 (function(){ console.log(0o11 === 011); // true })() // 严格模式 (function(){ 'use strict'; console.log(0o11 === 011); })() // Uncaught SyntaxError: Octal literals are not allowed in strict mode.
-
将 0b 和 0o 前缀的字符串数值转为十进制,可以把 Number 对象直接作为方法使用
Number('0b111') // 7 Number('0o10') // 8
isFinite、Number.isFinite
-
isFinite():在 ES5 中有全局的 isFinite() 函数用来判断被传入的参数值是否为一个有限的数值,如果参数是字符串,会首先转为一个数值,然后在进行验证;
isFinite(Infinity); // false isFinite(NaN); // false isFinite(-Infinity); // false isFinite(0); // true isFinite(2e64); // true isFinite('2e64'); // true isFinite("0"); // true
-
Number.isFinite():不会强制将一个非数值的参数转换成数值,这就意味着,只有数值类型的值,且是有穷的 (finite),才返回 true;
Number.isFinite(Infinity); // false Number.isFinite(NaN); // false Number.isFinite(-Infinity); // false Number.isFinite(0); // true Number.isFinite(2e64); // true Number.isFinite('2e64'); // false Number.isFinite('0'); // false
isNaN、Number.isNaN
-
isNaN 用了判断是否为 NaN 值,它接收的参数不是 Number 类型,isNaN 函数会先尝试将这个参数转换为数值,然后才会对转换后的结果是否是 NaN 进行判断;
isNaN(NaN); // true isNaN(undefined); // true isNaN('undefined')// true isNaN({}); // true isNaN(true); // false isNaN(null); // false isNaN(37); // false // strings isNaN("37"); // false: 可以被转换成数值37 isNaN("37.37"); // false: 可以被转换成数值37.37 isNaN("37,5"); // true isNaN('123ABC'); // true: parseInt("123ABC")的结果是 123, 但是Number("123ABC")结果是 NaN isNaN(""); // false: 空字符串被转换成0 isNaN(" "); // false: 包含空格的字符串被转换成0 // dates isNaN(new Date()); // false isNaN(new Date().toString()); // true isNaN("hello") // true: "hello"不能转换成数值
-
Number.isNaN(x):检测变量 x 是否是一个 NaN,不会对所判断的值进行强制类型转换,是一种可靠的做法;
Number.isNaN(NaN); // true Number.isNaN(Number.NaN); // true Number.isNaN(0 / 0) // true // 下面这几个如果使用全局的 isNaN() 时,会返回 true。 Number.isNaN("NaN"); // false,字符串 "NaN" 不会被隐式转换成数字 NaN Number.isNaN(undefined); // false Number.isNaN('undefined');// false Number.isNaN({}); // false Number.isNaN("blabla"); // false Number.isNaN(true); // false Number.isNaN(null); // false Number.isNaN(37); // false Number.isNaN("37"); // false Number.isNaN("37.37"); // false Number.isNaN(""); // false Number.isNaN(" "); // false
Number 对象的方法
Number.parseInt、Number.parseFloat
为了保持方法上的统一,把全局下的 parseInt() 和 parseFloat() 移植到 ES6 的 Number 对象上;
将这两个全局方法移植到 Number 对象上,为了逐步减少全局性方法,使语言逐步模块化;
// 如何证明 Number 下的这两个方法只是移植全局的呢?可以利用 === 运算符来判断
Number.parseInt === parseInt; // true
Number.parseFloat === parseFloat; // true
// ES5的写法
parseInt('12.34') // 12
parseFloat('123.45#') // 123.45
// ES6的写法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45
Number.isInteger
Number.isInteger() 是 ES6 新增的函数,用来判断给定的参数是否为整数;
其他方式:
- 任何整数都会被 1 整除,即余数是 0;
- 使用 Math.round、Math.ceil、Math.floor 判断,因为整数取整后还是等于自己;
Number.isInteger(0); // true
Number.isInteger(1); // true
Number.isInteger(-100000); // true
Number.isInteger(0.8); // false
Number.isInteger(Math.PI); // false
Number.isInteger(Infinity); // false
Number.isInteger(-Infinity); // false
Number.isInteger("100"); // false
Number.isInteger(true); // false
Number.isInteger(false); // false
Number.isInteger([1]); // false
🌿 reset、revert、rebase 解析
上一篇