了解下划线对isNaN的实现

时间:2013-03-02 15:22:42

标签: javascript numbers underscore.js nan

取自underscore.js来源:

_.isNaN = function(obj) {
  return _.isNumber(obj) && obj != +obj;
};

他们为什么这样做?以上实现是否等同于:

_.isNaN = function(obj) {
  return obj !== obj;
};

如果是,为什么“更复杂”的版本?如果不是,那么行为差异是什么?

4 个答案:

答案 0 :(得分:4)

_.isNaN(new Number(NaN))返回true。

那是by design

var n = new Number(NaN);
console.log(_.isNaN(n), n!==n); // logs true, false

答案 1 :(得分:1)

主机环境(例如,Web浏览器环境)可能引入与其自身不相等的其他值。 _.isNumber(obj)部分确保输入为Number值,以便_.isNaN仅在true值传递时返回NaN

答案 2 :(得分:0)

如果在任何没有前导值的值之前给出+,则JavaScript引擎会尝试将该变量转换为Number。如果它有效,它将为您提供Number,否则它将返回NaN。例如

 + "1" // is equal to integer value 1
 + "a1" // will be NaN because "a1" is not a valid number

在上述情况

 +"a1" != "a1" // true, so this is not a number, one case is satisfied
 +"1" == "1" // true, so it is number

另一个简单的例子是,为什么下面的表达式给出了这个输出

 console.log("Why I am " + typeof + "");
 // returns "Why I am number"

因为+“”为0.

如果您想检查它是否是数字,可以使用以下功能

function isNumber(a){ 
   /* first method : */  return (+a == a);
   /* second method : */  return (+(+a) >= 0);
   // And so many other exists
}

如果我在某处错了,有人会纠正我。

答案 3 :(得分:0)

我为_.isNaN找到了一个案例 如果你传递一个对象

,它会显示与本地结果不同的结果
_.isNaN({}) => false
//but
isNaN({}) => true