从underscore.js源摘自:理解下划线的实施isNaN
_.isNaN = function(obj) {
return _.isNumber(obj) && obj != +obj;
};
他们为什么做这种方式?以上实现是否相当于:
_.isNaN = function(obj) {
return obj !== obj;
};
如果是,为什么“更复杂”版本?如果不是,行为差异是什么?
从underscore.js源摘自:理解下划线的实施isNaN
_.isNaN = function(obj) {
return _.isNumber(obj) && obj != +obj;
};
他们为什么做这种方式?以上实现是否相当于:
_.isNaN = function(obj) {
return obj !== obj;
};
如果是,为什么“更复杂”版本?如果不是,行为差异是什么?
_.isNaN(new Number(NaN))
返回true。
这就是by design。
var n = new Number(NaN);
console.log(_.isNaN(n), n!==n); // logs true, false
主机环境(例如网页浏览器环境)可能会引入其他不等于自己的值。该_.isNumber(obj)
部分可以确保输入的是数值,因此,如果NaN
值传递_.isNaN
只返回true
。
你有一个主机环境的例子,介绍一个不等于自己的值? – Randomblue 2013-03-02 16:17:31
@Randomblue没有。我从来没有听说过这样的价值,因此*可能*。 – 2013-03-02 18:50:27
好的。聪明的想法,理论上说,主机环境把所有的赌注都关闭了。 – Randomblue 2013-03-02 18:57:05
如果+与前款没有价值+任意值的前给予JavaScript引擎将尝试把变量转换为Number.If它是有效的,它会给你数否则将返回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
或者更简单,本机'isNaN'功能... – 2013-03-02 15:24:55
@Kolink从下划线文档拍摄:“注意:如果变量是不确定的,这是不一样的本地isNaN功能,这也将返回true” – robertklep 2013-03-02 15:26:23
@Kolink' isNaN(未定义)'给出true。 – 2013-03-02 15:27:14