zoukankan      html  css  js  c++  java
  • [译]JavaScript:NaN和Infinity

    原文:http://www.2ality.com/2012/02/nan-infinity.html


    本文要讲的是两个特殊值,NaN和Infinity,返回这两个值的操作通常都应该返回正常的数字.

    1.NaN

    在JavaScript中,NaN代表了“not a number”.主要在解析字符串出现错误时会返回这个值:

    > Number("xyz")
    NaN

    NaN的名字是“not a number”,不过也可以说是not not a number:

    > NaN !== NaN 
    true

    它是一个数字!类型为"number"

    > typeof NaN
    'number'

    1.1 检测NaN

    JavaScript中,NaN是惟一一个和自己也不想等的值.所以,也就不能使用等号运算符来判断一个值是否是NaN,不过有全局函数isNaN()来干这件事.

    > isNaN(NaN)
    true

    Kit Cambridge指出isNaN()的一个问题:它会隐式的将它的参数转换成数字,所以即便参数是个不能转换成数字的字符串,它也会返回true(转换成了NaN):

    > Number("xyz")
    NaN
    > isNaN("xyz")
    true

    由于相同的原因,isNaN对其他很多对象也返回true:

    > Number({})
    NaN
    > isNaN({})
    true
    
    > Number(["xzy"])
    NaN
    > isNaN(["xzy"])
    true

    重写了valueOf方法的自定义对象同样:

    > var obj = { valueOf: function () { return NaN } };
    > Number(obj)
    NaN
    > isNaN(obj)
    true

    所以可以利用NaN是唯一一个满足(x !== x)不等式的值来写一个自己的isNaN函数,这样就不会有上面提到的问题:

    function myIsNaN(x) {
        return x !== x;
    }

    目前一个修正版的isNaN方法Number.isNaN()已经被添加到了ECMAScript 6中(译者注:Firefox已经实现了).Crockford实现的这个方法,比上面的myIsNaN更容易理解,核心代码是这样的:

    Number.isNaN = function (value) {
        return typeof value === 'number' && isNaN(value);
    };

    2.Infinity

    用0作除数会产生另外一个特殊值Infinity:

    > 3/0
    Infinity
    

    你不能想当然的猜测正无穷大或者负无穷大的计算结果:

    >Infinity - Infinity
    NaN

    比无穷大还大的值仍然是无穷大:

    > Infinity + Infinity
    Infinity
    > 5 * Infinity
    Infinity
    

    3.参考

    1. [译]JavaScript中,{}+{}等于多少?
  • 相关阅读:
    redis的数据类型与应用场景(二)
    redis的安装与配置(一)
    Spring Security教程 ---- 验证码功能的实现
    Java类文件结构
    实体字符
    前端安全之XSS攻击
    $_SERVER[]数组解析
    php主要用于哪几方面
    集群与分布式概念
    python操作mongodb实例
  • 原文地址:https://www.cnblogs.com/ziyunfei/p/2690866.html
Copyright © 2011-2022 走看看