[JavaScript语法学习]全面介绍Number

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. 

posted @ 2016-12-11 21:39  小碎石  阅读(260)  评论(0编辑  收藏  举报