7

取自 underscore.js 源:

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

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

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

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

4

4 回答 4

4

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

这是设计使然

var n = new Number(NaN);
console.log(_.isNaN(n), n!==n); // logs true, false
于 2013-03-02T15:31:59.653 回答
1

宿主环境(例如网络浏览器环境)可能会引入其他不等于自身的值。该_.isNumber(obj)部分确保输入是一个数字值,因此只有在传递该值_.isNaN时才返回。trueNaN

于 2013-03-02T15:52:21.753 回答
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
}

如果我在某处错了,请有人纠正我..

于 2013-03-02T15:56:41.010 回答
0

我找到了一个 _.isNaN 的案例

_.isNaN({}) => false
//but
isNaN({}) => true
于 2016-03-24T13:33:25.727 回答