(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!)
(注2:更多内容请查看我的目录。)
1. 简介
为了便于操作基本类型值,ECMAScript提供了3个特殊的引用类型作为基本包装类型:String,Number和Boolean。实际上,每当读取一个基本类型值得时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。
2. Number类型对象创建
Number类型是与数字值对应的引用类型,Number类型对象创建是使用Number构造函数。下面是使用Number构造函数传入不同类型参数后的情况。
// 传入Number类型
console.log(new Number(1)); // Number {1}
// 传入NaN类型
console.log(new Number(NaN)); // Number {NaN}
// 传入Infinity类型
console.log(new Number(Infinity)); // Number {Infinity}
// 传入String类型
console.log(new Number('123')); // Number {123}
// 传入Undefined类型
console.log(new Number(undefined)); // Number {NaN}
// 传入Null类型
console.log(new Number(null)); // Number {0}
// 传入Boolean类型
console.log(new Number(true)); // Number {1}
// 传入Array类型
console.log(new Number([1,2])); // Number {NaN}
// 传入Function类型
console.log(new Number(function(){return 1;})); // Number {NaN}
// 传入Object类型
console.log(new Number({a: 1})); // Number {NaN}
// 传入空对象
console.log(new Number({})); // Number {NaN}
Number构造函数接收基本类型值时,能将其转换成对应的包含数字的对象,但是undefined会被转成{NaN},传入对象也会转换成{NaN}。
注意:null是基本类型值,是一个空对象指针,而{}是空对象。
省略new的效果一样。
3. 数字值读取
其实,在读取模式中访问数字值时,后台会自动完成以下处理:
(1)创建Number类型的一个实例;
(2)在实例上调用指定的方法;
(3)销毁该实例。
4. Number构造函数的属性与方法
我们用Object.getOwnPropertyNames()方法获取Number构造函数的所有属性与方法。
Object.getOwnPropertyNames(Number);
// (17) ["length", "name", "prototype", "isFinite", "isInteger", "isNaN", "isSafeInteger", "parseFloat", "parseInt", "MAX_VALUE", "MIN_VALUE", "NaN", "NEGATIVE_INFINITY", "POSITIVE_INFINITY", "MAX_SAFE_INTEGER", "MIN_SAFE_INTEGER", "EPSILON"]
发现一共有17个属性和方法。
4.1 Number构造函数的属性
Number.length
长度为1
Number.name
名称为"Number"
Number.prototype
指向Number构造函数的原型,可以为所有Number类型的对象添加属性。
Number.EPSILON
表示 1 和大于 1 的最小值的差值,是一个常量,接近于 2.2204460492503130808472633361816E-16,或者 2-52。引入这么小的一个常量的目的在于,为浮点数计算设置一个误差范围。因为浮点数的计算是不精确的。如果误差小于Number.EPSILON,我们就可以认为得到了正确的结果。
0.1+0.2; //0.30000000000000004
0.1+0.2-0.3; //5.551115123125783e-17
(0.1+0.2-0.3).toFixed(20); //"0.00000000000000005551"
// 那么我们再来看看0.1+0.2-0.3的值是否小于Number.EPSILON,如果小于,返回true,那我们便可以认为结果正确
(0.1+0.2-0.3).toFixed(20)<Number.EPSILON; // true
其实,Number.EPSILON就是一个可接受的误差范围。
Number.MAX_SAFE_INTEGER
该常量表示在 JavaScript 中最大的安全整数(maxinum safe integer)(253 - 1)。IEEE 754 标准规定能够准确地表示整数和正确地比较整数的数字范围是在 -(253 - 1) 到 253 - 1 之间,包含 -(253 - 1) 和 253 - 1。
Number.MIN_SAFE_INTEGER
代表在 JavaScript中最小的安全的integer型数字 (-(253 - 1)).
Number.MAX_VALUE
表示在 JavaScript 里所能表示的最大数值。该值接近于 1.79E+308,大于 MAX_VALUE 的值代表 "Infinity"。
Number.MIN_VALUE
表示在 JavaScript 里所能表示的最小的正数。MIN_VALUE 的值约为 5e-324。小于 MIN_VALUE ("underflow values") 的值将会转换为 0。
Number.NaN
表示“非数字”的值(Not-A-Number)。
Number.NEGATIVE_INFINITY
表示负无穷大,在溢出时返回该值。和全局对象的 Infinity 属性的负值相同。
为了成功返回一个有限值,你可能会使用 Number.NEGATIVE_INFINITY 属性来判断是否显示一个条件错误 。然而 isFinite()方法更适合这种情况。
Number.POSITIVE_INFINITY
表示正无穷大,在溢出时返回该值。和全局对象的 Infinity 属性的值相同。
为了成功返回一个有限值,你可能会使用 Number.POSITIVE_INFINITY 属性来判断是否显示一个条件错误 。然而 isFinite()方法更适合这种情况。
4.2 Number构造函数的方法
Number.isNaN()
确定传递的值是否是 NaN。
Number.isFinite()
确定传递的值类型及本身是否是有限数。
Number.isInteger()
判断给定的参数是否为整数。
Number.isSafeInteger()
确定传递的值是否为安全整数 ( -(253 - 1) 至 253 - 1之间)。
Number.parseFloat()
以把一个字符串解析成浮点数。该方法与全局的 parseFloat()函数相同。
Number.parseInt()
以把一个字符串解析成整数。该方法与全局的 parseFloat()函数相同。
5. Number原型对象的属性与方法
我们用Object.getOwnPropertyNames()方法获取Number原型对象的所有属性与方法。
Object.getOwnPropertyNames(Number.prototype);
// (7) ["constructor", "toExponential", "toFixed", "toPrecision", "toString", "valueOf", "toLocaleString"]
发现一共有7个属性和方法。其中有相当一部分是与HTML相关的方法。
5.1 Number原型对象的属性
Number.prototype.constructor
指向构造函数Array
5.2 Number原型对象的方法
注意:整数无法直接调用Number原型对象的方法(是JS装箱机制的原因吗?),但是将其赋值给变量以后可以。
Number.prototype.toExponential()
返回一个科学计数法字符串
console.log(3000.toExponential()); // 会报错
console.log(3000.0.toExponential()); // "3e+3"
console.log(new Number(3000).toExponential()); // "3e+3"
var a = 3000;
console.log(a.toExponential()); // "3e+3"
Number.prototype.toFixed()
转化成一个精确到小数点后指定位数的字符串返回,默认是小数点后0位。
console.log(3000.toFixed(2)); // 会报错
console.log(3000.0.toFixed(2)); // "3000.00"
console.log(new Number(3000).toFixed(2)); // "3000.00"
Number.prototype.toString()
转化成一个精确到指定进制的字符串返回,默认是十进制。
console.log(12.toString(16)); // 会报错
console.log(12.0.toString(16)); // "c"
console.log(new Number(12).toString(16)); // "c"
Number.prototype.toLocalString()
转化成一个精确到指定进制的字符串返回,默认是十进制。与语言相关,但大多数语言情况与Number.prototype.toString()相同。
Number.prototype.toPrecision()
转化成一个保留指定位数的字符串(四舍五入)返回。
console.log(666.toPrecision(2)); // 会报错
console.log(666.6666.toPrecision(2)); // "6.7e+2"
console.log(new Number(6666666).toPrecision(3)); // "6.67e+6"
console.log(6.67e+6.toPrecision(2)); // "6.7e+6"
console.log(new Number(6.6e+6).toPrecision(3)); // "6.60e+6"
Number.prototype.valueOf()
返回指定对象的原始值。覆盖了Object对象的 valueOf() 方法。
6. Number实例对象的属性与方法
我们用Object.getOwnPropertyNames()方法获取Number实例对象的所有属性与方法。
var num = new Number(123);
Object.getOwnPropertyNames(num);
// []
没有任何自有属性与方法。
参考
MDN-Number
BOOK-《JavaScript高级程序设计(第3版)》第5章
ES6中Number的一些扩展方法(一)