JavaScript中的Number对象是经过封装的能够让你处理数字值的对象,Number对象是由Number()构造器创建的
语法
new Number(value);
属性
Number.EPSILON | 两个可表示数之间的最小间隔( 2.220446049250313e-16 ) |
Number.MAX_SAFE_INTEGER | 最大的安全整数(253-1 = 9007199254740991) |
Number.MAX_VALUE | 能表示的最大正数 ( 1.7976931348623157e+308 ) |
Number.MIN_SAFE_INTEGER | 最小的安全整数( -253+1 = -9007199254740991) |
Number.MIN_VALUE | 能表示的最小正数 ( 5e-324 ) |
Number.NaN | |
Number.NEGATIVE_INFINITY | 特殊的负无穷大值,在溢出时返回该值 ( -Infinity ) |
Number.POSITIVE_INFINITY | 特殊的正无穷大值,在溢出时返回该值 ( Infinity ) |
Number.prototype |
方法
Number.isNaN(value) (ES6新增)
用来检测传入的值是否为NaN,返回布尔值.
因为NaN==NaN NaN===NaN都会返回false, 所以不能使用相等运算符来判断某个值是否为NaN
只有在value为真正的数字类型且值为NaN时才会返回true
//返回true
Number.isNaN(NaN)
Number.isNaN(Number.NaN)
Number.isNaN(0/0)
//返回false
Number.isNaN(45)
Number.isNaN("45")
Number.isNaN("")
Number.isNaN(null)
Number.isNaN(true)
Polyfill
Number.isNaN = Number.isNaN || function(value){
return typeof value === "number" && isNaN(value);
}
Number.isFinite(value) (ES6新增)
用来检测传入的值是否为一个有穷数( finite number),返回布尔值
只有数值类型的值为有穷数时才会返回true
//返回false
Number.isFinite(Infinity)
Number.isFinite(-Infinity)
Number.isFinite(NaN)
Number.isFinite("45")
//返回true
Number.isFinite(2e52)
Polyfill
Number.isFinite = Number.isFinite || function(value){
return typeof value === "number" && isFinite(value);
}
总结:
与传统的isFinite()和isNaN()方法的区别在于,传统方法会先调用Number()方法将非数值转换为数值,再进行判断。
而Number.isFinite()和Number.isNaN()方法只对数值才有效,所以传入参数如果是非数值则直接返回false
任何与NaN有关的运算结果都是NaN
NaN与任何值都不相等,即使是NaN自身比较也不相等
Number.isInteger(value) (ES6新增)
用来判断给定的参数是否为整数,返回布尔值。NaN和正负Infinity都不是整数。
//返回true
Number.isInteger(0)
Number.isInteger(-1)
//返回false
Number.isInteger(0.1)
Number.isInteger(Math.PI)
Number.isInteger("0")
Number.isInteger(false)
Number.isInteger([1])
Number.isInteger(Infinity)
Polyfill
Number.isInteger = Number.isInteger || function(){
return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
}
Number.isSafeInteger()
用来判断某个值是否落在安全整数范围内
大坑:
这个方法只会验证运算结果(也就是传入的参数)是否落在安全整数范围内。但是有时候我们需要判断参与运算的每个值是否落在安全范围内。
Number.isSafeInteger(9007199254740993 - 992); // 这个方法返回的结果是true // 但是这个运算结果不准确,因为第一个数值已经超出了安全整数范围 // 超出安全整数范围的值是等于最大安全整数的 function trusty(left, right, result){ if(Number.isSafeInteger(left) && Number.isSafeInteger(right) && Number.isSafeInteger(result)){ return result; } throw new RangeError("operation cannot be trusted!"); }
Number.ParseFloat() (ES6新增)
parseFloat(string)全局函数:将参数中指定的字符串解析为浮点数并返回
如果在解析过程中遇到除正负号,数字,小数点和科学计数法中的指数以外的字符,则会忽略该字符及之后的所有字符,返回当前已经解析到的浮点数,如果第一个字符就不能被解析为数字则返回NaN
parseFloat("3.14");
parseFloat("314e-2");
parseFloat("0.0314E+2);
parseFloat("3.14more non-digit characters");
parseFloat(".0"); //0
parseFloat(".1"); //0.1
parseFloat("F1");
Polyfill
var filterFloat = function(value){
if( /^(-|+)?([0-9]+(.[0-9]+)?|Infinity)$/.test(value) )
return Number(value);
return NaN;
}
Number.ParseInt() (ES6新增)
parseInt(string, radix)全局函数,将给定的字符串以指定的基数解析为整数。如果第一个字符都无法被转换为数值类型则返回NaN
parseInt和parseFloat这两个全局函数的解析原理都是一样的。都是将字符串进行解析并试图返回一个数值或者NaN。如果结果不是NaN那么返回值将看作是radix参数指定的进制下的数,然后将其转换为十进制的数值。如果遇到了不属于radix参数所指定的基数中的字符,那么该字符及其后面的字符都会被忽略。返回已经解析的数值部分。parseInt将截取整数部分。
如果没有指定基数或者基数为0时,字符串以0x/0X开头表示16进制,以0开头表示8进制或者10进制,取决于浏览器环境,不建议使用这种方式。其余情形则默认为10进制。
Polyfill
filterInt = function(value){
if( /^(-|+)?([0-9]+|Infinity)$/.test(value) )
return Number(value);
return NaN;
}
总结:
parseInt() parseFloat() 与Number.parseInt() Number.parseFloat() 行为完全一致,仅仅是为了减少全局性方法,使得语言逐步模块化。
ES6关于Number的扩展
1. 在ES6中,二进制和八进制数值有了新的表示方法
二进制的表示方法使用0b(0B)
八进制的表示方法使用0o(0O) 建议不要再使用以前的0前缀表示
十六进制的表示方法使用0x(0X)
将字符串转换为数值类型使用Number()
2. 新增Number.isFinite(), Number.isNaN(), Number.parseInt(), Number.parseFloat(), Number.isInteger()
3. 新增Number.EPSILON
引入的目的在于为浮点数计算设置一个误差范围
function withinErrorMargin(left, right){ return Math.abs(left-right)<Number.EPSILON; } withinErrorMargin(0.2+0.1, 0.3); withinErrorMargin(0.2+0.2, 0.3);
4.