导读:Number 类型也是 ECMAScript 中非常重要的基本类型之一。在官方文档中,它将 Number、全局对象 Date 和 Math 放在了一起。那么我们索性就一块讲了吧。这节内容不多,也是非常容易掌握的。主要的是我们常使用的方法。
Number 构造函数
按照惯例,我们还是一开始就讲讲这个东西。经过前面的学习,这里的东西就不再讲的那么细了。大家应该一看就能理解。
Number 构造函数是 %Number% 内部对象和全局对象的 Number 属性的初始值。当作为构造函数调用时,它创建并初始化一个新的 Number 对象。 当 Number 作为函数而不是作为构造函数调用时,它将执行类型转换。
Number 构造函数设计为可子类化。 它可以用作类定义的 extends 子句的值。 打算继承指定的 Number 行为的子类构造函数必须包含一个对 Number 构造函数的 super 调用,以使用 [[NumberData]] 内部插槽创建和初始化子类实例。
第一段话很好理解,就是我们平时创建 Number 对象的定义;关于第二段话呢,实际上也是对于 ES6 新特性的附加,当我们学习到 Class 的时候,再来理解也不迟。
与 String 类型一致,Number 构造函数的 [[Prototype]]
同样也是指向 %FunctionPrototype%
的。
那么我们接下来就讲解 Number 构造函数的方法吧。
(1)Number.isFinite ( number )
概述:该用来检测传入的参数是否是一个有穷数。
内部的解释过程如下:
如果传入的值不为 Number 类型,则返回 false;如果传入的值为 NaN,+∞ 或 -∞ 时,也返回 false;否则,返回 true。
代码形式:
console.log( Number.isFinite(123) ); // true
console.log( Number.isFinite('Hello') ); // false
console.log( Number.isFinite(NaN) ); // false
console.log( Number.isFinite(-Infinity) ); // false
这里需要注意:在 Number 类型中,正无穷表示为 Infinity(或 +Infinity);负无穷表示为 -Infinity。
(2)Number.isInteger ( number )
概述:该方法用来判断给定的参数是否为整数。
内部的解释过程如下:
如果传入的值不为 Number 类型,则返回 false;如果传入的值为 NaN,+∞ 或 -∞ 时,也返回 false;内部调用
ToInteger()
方法,如与传入的参数不相等,则返回 false;否则,返回 true。
那我们来谈谈这个 方法是什么原理。不知道有没有聪明的小伙伴想到啦?
没错,内部调用的这个方法就是 —— **floor (abs(number)) **。
很简单吧?我们掌握了语言内部的组织和解释过程,对于我们理解所调用的方法帮助多大啊!大家记住上面这个表达式就可以装逼啦!咳咳。。。低调低调。
代码形式:
console.log( Number.isInteger(123) ); // true
console.log( Number.isInteger(123.45) ); // false
console.log( Number.isInteger(NaN) ); // false
简化此判断过程后可写成如下函数:
function isInteger (number) {
if (number === Math.floor(Math.abs(number))){
return true;
}
}
console.log( isInteger(123) ); // true
现在,我相信你们一定是学会啦。
概述:该方法用来检测传入的值是否是 NaN。该方法比传统的全局函数
isNaN()
更可靠。
对于为什么不使用 isNaN()
函数。
MDN 中对此有一个比较好的解释:
在 JavaScript 中,NaN 最特殊的地方就是,我们不能使用相等运算符(== 和 ===)来判断一个值是否是 NaN,因为 NaN == NaN 和 NaN === NaN 都会返回 false。因此,必须要有一个判断值是否是 NaN 的方法。 和全局函数 isNaN() 相比,该方法不会强制将参数转换成数字,只有在参数是真正的数字类型,且值为 NaN 的时候才会返回 true。
该函数内部的解释过程:
如果传入参数不是 Number 类型,返回 false;只有在参数等于 NaN 时,才返回 true;其它一律返回 false。
本教程就是告诉你。你为什么这么做,同时,这么做到底有什么好处!我们就是本着打破砂锅问到底的精神来学习不是吗?
为什么不使用 isNaN()
函数?因为它内部的解释过程是这样的:
将参数在内部执行 ToNumber() 方法,将其转换为 Number 类型;如果为 NaN,则返回 true;其它一律返回 false。
这下我们就知道了它为什么不靠谱,它还要在内部进行一次转换,依次寻找对应类型,再转换。这就等于多了一个步骤。
所以我们以后使用 Number.isNaN() 方法来代替原来的全局函数。这里的关键点是:不要忘记了在前面加上** Number.**,不然就变成了调用另一个全局函数了哦~
(4)Number.isSafeInteger ( number )
概述:Number.isSafeInteger() 方法用来判断传入的参数值是否是一个“安全整数”(safe integer)。
这个方法,想必我们也不常用,但是我们需要知道什么是“安全整数”。
在 ECMAScript 语言中,只有在 -253-1 到 253-1 之间的整数(包含这两个整数),才能够被精确表示,而关于 Number 类型是双精度浮点数这些知识点我就不深入讲了。
我们简单的认为内部的解释过程是:abs(integer) ≤ 253-1 时,才返回 true。这就足够了。
(5)Number.MAX_SAFE_INTEGER、Number.MAX_VALUE、Number.MIN_SAFE_INTEGER、Number.MIN_VALUE
概述:这四个函数我们平时也不怎么会用到。所以我简单说下它们分别代表什么意思吧。
Number.MAX_SAFE_INTEGER
:它的值就是 9007199254740991 (253-1)。
Number.MAX_VALUE
:它的值是 Number 类型的最大正有限值,也就是约为 1.7976931348623157 × 10308。
Number.MIN_SAFE_INTEGER
:它的值就是 -9007199254740991 (-253-1)。
Number.MIN_VALUE
:它的值是 Number 类型的最大正有限值,也就是约为 -1.7976931348623157 × 10308。
(6)Number.NaN
概述:该方法的值就是 NaN。
我们需要使用 NaN 时,可以使用 Number.NaN 代替。这显得更加严谨。如果我没记错的话,这也是 ES6 中新添加的吧,如果错了赶紧告诉我哈。
与下面的两个方法一样,这看出了 ECMAScript 组委会的心思,他们想要最大程度的削减全局函数的使用。个人认为,在未来我们使用的方法都是(Object.prototype 中定义)和函数(Function.prototype 中定义)中的。而全局函数和全局变量将会退出历史舞台。
(7)Number.parseFloat ( string )、Number.parseInt ( string, radix )
概述:Number.parseFloat() 方法可以把一个字符串解析成浮点数;Number.parseInt() 方法可以根据给定的进制数把一个字符串解析成整数。
这两个方法与全局的 parseFloat()
与 parseInt()
方法一致。
Number.parseFloat() 方法可以仅将字符串的前导部分解释为数值:
console.log( Number.parseFloat('123abc') ); // 123
Number.parseInt() 方法可以把一个字符串解析成整数:
// 这里的 8 表示解析为 8 进制
console.log( Number.parseInt('60',8) ); // 48
如果解析的不正确,那么会返回 NaN:
console.log( Number.parseFloat('abc') ); // NaN
console.log( Number.parseInt('a',8) ); // NaN
(8)Number.NEGATIVE_INFINITY、Number.POSITIVE_INFINITY
概述:这两个方法用来表示 -∞ 和 +∞。
这个很好理解吧。这个记住就好啦。
总结
这一小节将 Number 类型的构造函数方法都讲了。看看,也就这么点东西。下一节将要讲述原型方法了。