美文网首页JavaScript
ES6学习第五节:Number扩展

ES6学习第五节:Number扩展

作者: ChangLau | 来源:发表于2019-01-18 15:43 被阅读0次
    • Number.isFinite

    Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity

    Number.isFinite(15) // true
    Number.isFinite(0.8) // true
    Number.isFinite(NaN) // false
    Number.isFinite(Infinity) // false
    Number.isFinite(-Infinity) // false
    Number.isFinite('foo') // false
    Number.isFinite('15') // false
    Number.isFinite(true) // false
    
    • Number.isNaN

    Number.isNaN()用来检查一个值是否为NaN

    Number.isNaN(NaN) // true
    Number.isNaN(15) // false
    Number.isNaN('15') // false
    Number.isNaN(true) // false
    Number.isNaN(9 / NaN) // true
    Number.isNaN('true' / 0) // true
    Number.isNaN('true' / 'true') // true
    
    • Number.isFinite、Number.isNaN和全局方法isFinite、isNaN的区别

    它们与传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()对于非数值一律返回false, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false。

    // 先调用Number()将非数值转化为数值判断
    isFinite(25) // true
    isFinite('25') // true
    // 不转化直接判断,对非数值一律返回false
    Number.isFinite(25) // true
    Number.isFinite('25') // false
    
    // 同isFinite,先转化后判断
    isNaN(NaN) // true
    isNaN("NaN") // true
    // 同Number.isFinite,直接判断
    Number.isNaN(NaN) // true
    Number.isNaN("NaN") // false
    
    • Number.parseInt和Number.parseFloat

    ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。

    // ES5的写法
    parseInt('12.34') // 12
    parseFloat('12.345#') // 123.45
    // ES6的写法
    console.log(Number.parseInt(12.34)); // 12
    console.log(Number.parseFloat('12.345#')); // 12.34
    
    Number.parseInt === parseInt // true
    Number.parseFloat === parseFloat // true
    
    • Number. isInteger

    如果对数据精度的要求较高,不建议使用Number.isInteger()判断一个数值是否为整数。

    // 数值
    Number.isInteger(25) // true
    Number.isInteger(25.1) // false
    Number.isInteger(25.0) // true
    
    // 非数值
    Number.isInteger() // false
    Number.isInteger(null) // false
    Number.isInteger('15') // false
    Number.isInteger(true) // false
    
    // 误判
    // 小数的精度达到了小数点后16个十进制位,转成二进制位超过了53个二进制位,导致最后的那个2被丢弃
    Number.isInteger(3.0000000000000002) // true
    // 一个数值的绝对值小于Number.MIN_VALUE(5E-324),即小于 JavaScript 能够分辨的最小值,会被自动转为 0。
    Number.isInteger(5E-324) // false
    Number.isInteger(5E-325) // true
    
    • Number.EPSILON

    一个数值很小的常量,主要用于浮点数计算,Number.EPSILON可以用来设置“能够接受的误差范围”。

    0.1 + 0.2
    // 0.30000000000000004
    
    0.1 + 0.2 - 0.3
    // 5.551115123125783e-17
    
    // 误差范围设为 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。
    console.log(0.1 + 0.2 - 0.3 < Number.EPSILON * Math.pow(2, 2)) // true
    
    // Number.EPSILON的实质是一个可以接受的最小误差范围。
    
    • 安全整数和Number.isSafeInteger
    // 安全整数范围 -2的53次方 到 2的53次方(不包含两个端点)
    Math.pow(-2, 53) < Safe Integer Number < Math.pow(2, 53)
    
    //  超过安全范围之后计算失真
    Math.pow(2, 53) === Math.pow(2, 53) + 1 // true
    
    // ES6引入最大最小常量,表示这个范围的上下限
    Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 // true
    Number.MIN_SAFE_INTEGER === Math.pow(2, 53) + 1 // true
    
    // 用来判断数值是否位于安全整数范围内
    Number.isSafeInteger('a') // false
    Number.isSafeInteger(null) // false
    Number.isSafeInteger(NaN) // false
    Number.isSafeInteger(Infinity) // false
    Number.isSafeInteger(-Infinity) // false
    
    Number.isSafeInteger(3) // true
    Number.isSafeInteger(1.2) // false
    Number.isSafeInteger(9007199254740990) // true
    Number.isSafeInteger(9007199254740992) // false
    
    Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false
    Number.isSafeInteger(Number.MIN_SAFE_INTEGER) // true
    Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
    Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false
    
    // 函数实现
    Number.isSafeInteger = function (n) {
      return (typeof n === 'number' &&
        Math.round(n) === n &&
        Number.MIN_SAFE_INTEGER <= n &&
        n <= Number.MAX_SAFE_INTEGER);
    }
    

    相关文章

      网友评论

        本文标题:ES6学习第五节:Number扩展

        本文链接:https://www.haomeiwen.com/subject/yvrndqtx.html