取自underscore.js来源:
_.isNaN = function(obj) {
return _.isNumber(obj) && obj != +obj;
};
他们为什么这样做?以上实现是否等同于:
_.isNaN = function(obj) {
return obj !== obj;
};
如果是,为什么“更复杂”的版本?如果不是,那么行为差异是什么?
答案 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