2013-03-02 92 views
7

从underscore.js源摘自:理解下划线的实施isNaN

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

他们为什么做这种方式?以上实现是否相当于:

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

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

+0

或者更简单,本机'isNaN'功能... – 2013-03-02 15:24:55

+2

@Kolink从下划线文档拍摄:“注意:如果变量是不确定的,这是不一样的本地isNaN功能,这也将返回true” – robertklep 2013-03-02 15:26:23

+1

@Kolink' isNaN(未定义)'给出true。 – 2013-03-02 15:27:14

回答

4

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

这就是by design

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

所以现在'Number.isNaN()'。 – Pointy 2013-03-02 15:34:30

+0

@Pointy'Number.isNaN(新数(NAN))''返回作为FALSE'的Chrome 26.0.1410.65和FireFox 21 – Andbdrew 2013-05-18 20:28:15

+0

@Andbdrew是的,这就是我的意思 - 'Number.isNaN()'返回true,只有当它的参数是原始类型'数字'(不是'数字'),并且是特殊的'NaN'常数。 – Pointy 2013-05-18 20:33:45

1

主机环境(例如网页浏览器环境)可能会引入其他不等于自己的值。该_.isNumber(obj)部分可以确保输入的是数值,因此,如果NaN值传递_.isNaN只返回true

+1

你有一个主机环境的例子,介绍一个不等于自己的值? – Randomblue 2013-03-02 16:17:31

+0

@Randomblue没有。我从来没有听说过这样的价值,因此*可能*。 – 2013-03-02 18:50:27

+0

好的。聪明的想法,理论上说,主机环境把所有的赌注都关闭了。 – Randomblue 2013-03-02 18:57:05

0

如果+与前款没有价值+任意值的前给予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 
} 

有人纠正我,如果我错了地方..

+0

JavaScript中没有整数。 '+“1.5e-1”' – Bergi 2013-03-02 16:14:19

+0

@Bergi上述功能是否以+“1.5e-1”失败?是的,整数,而不是数字是错字..我同意..你在javaScript中称为0.1?..? – Exception 2013-03-02 16:37:09

+0

不,但'0.15'是一个非整数,纯数*的例子:-) – Bergi 2013-03-02 16:38:11

0

我发现一个案例_.isNaN 它显示了与本地一个不同的结果,如果你有传递一个对象

_.isNaN({}) => false 
//but 
isNaN({}) => true