取自 underscore.js 源:
_.isNaN = function(obj) {
return _.isNumber(obj) && obj != +obj;
};
他们为什么这样做?上述实现是否等同于:
_.isNaN = function(obj) {
return obj !== obj;
};
如果是,为什么是“更复杂”的版本?如果不是,行为差异是什么?
取自 underscore.js 源:
_.isNaN = function(obj) {
return _.isNumber(obj) && obj != +obj;
};
他们为什么这样做?上述实现是否等同于:
_.isNaN = function(obj) {
return obj !== obj;
};
如果是,为什么是“更复杂”的版本?如果不是,行为差异是什么?
_.isNaN(new Number(NaN))
返回真。
这是设计使然。
var n = new Number(NaN);
console.log(_.isNaN(n), n!==n); // logs true, false
宿主环境(例如网络浏览器环境)可能会引入其他不等于自身的值。该_.isNumber(obj)
部分确保输入是一个数字值,因此只有在传递该值_.isNaN
时才返回。true
NaN
如果 + 在任何没有前面值的值之前给出 + ,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
}
如果我在某处错了,请有人纠正我..
我找到了一个 _.isNaN 的案例
_.isNaN({}) => false
//but
isNaN({}) => true