Javascript 为什么'isFinite(null)==true`?
以下是对我有意义的例子Javascript 为什么'isFinite(null)==true`?,javascript,null,Javascript,Null,以下是对我有意义的例子 isFinite(5) // true - makes sense to me, it is a number and it is finite typeof 5 // "number" isFinite(Infinity) // false - makes sense for logical reasons typeof Infinity // "number" isFinite(document) // false - makes sense as well,
isFinite(5) // true - makes sense to me, it is a number and it is finite
typeof 5 // "number"
isFinite(Infinity) // false - makes sense for logical reasons
typeof Infinity // "number"
isFinite(document) // false - makes sense as well, it's not even a number
typeof document // "object"
下面是我感到困惑的地方
isFinite(null) // true - Wait what? Other non-number objects returned false. I see no reason?
typeof null // "object"
我只是不明白这背后的道理。
我想要的是最低级的答案。
我认为null
正在转换为0,为什么?这还有什么影响?来自MDN:
函数的作用是:确定传递的值是否为
有限数。如果需要,首先将参数转换为
号码
所以,它被转换成一个数字
isFinite(null)
isFinite(+null) //convert to a number
isFinite(0) // true because +null or Number(null) = 0
规范说,全局isFinite()
方法将强制将参数转换为数字
但是,您可以(自行承担风险)使用不执行此转换的EcmaScript 6规范
Number.isFinite(null) // false
或者,像lodash和下划线那样做
var _.isFinite = function(obj) {
return isFinite(obj) && !isNaN(parseFloat(obj));
};
ECMAScript规范(5.1)将isFinite
定义为:
isFinite(数字)
如果参数强制为NaN,则返回false+∞, 或−∞, 否则返回true
如果ToNumber(number)为NaN+∞, 或−∞, 返回false
否则,返回true
换句话说,isFinite
调用传入的任何内容,然后将其与pos/neg infinity或NaN进行比较
在JavaScript中(注意使用!=
而不是更常见的!=
,导致类型转换):
(如中所述,someInput!=NaN
是不需要的,因为NaN
被定义为不等同于一切,包括其本身。)
现在,为什么null
转换为零(与未定义的相反)?与注释中一样,null
表示存在一个值,但为空。它的数学表示为0undefined
意味着那里没有值,因此我们在尝试调用ToNumber
时会得到NaN
然而,ECMAScript 6带来了一个非转换的isFinite
,作为Number
的属性。道格拉斯·克罗克福德(Douglas Crockford)在这里建议:isFinite
types将其参数转换为一个数字,如果它还不是一个数字。实际上,您有isFinite(Number(null))
和Number(null)==0
。它是有限的。调用它的参数。所以
> Number(null)
0
> Number(document)
NaN
> isFinite(0)
true
> isFinite(NaN)
false
> isFinite(null)
true
> isFinite(document)
false
因为,如果你说
数字(null)==0
这是有限的
看
也就是说,对于参数类型null
来说,结果是+0
除了null
之外,您还发现以下有趣的内容:
alert(isFinite(' ')); //true
alert(isFinite('')); //true
alert(isFinite(null)); //true
alert(isFinite(!undefined)); //true
在JavaScript隐式转换中,当比较数字和布尔值时,此转换尝试将布尔值转换为整数,或者当比较字符串和数字时,将数字转换为字符串。若将任何数据类型视为数字,它将隐式转换为数字,所以上述所有情况都返回零,这是有限的
如果你尝试Number(未定义)
它会给你一个NaN
的否定,这将产生一个有限的1。为什么它是“需要的”?我可以看出这是已经返回的,我在问为什么:P@Jhawins:因为规范上是这么说的。其他一切都是意见。我很乐意接受你的回答,但看看下面@SomeKittens做了什么。。。你赢了他1分钟,但那很聪明。还有一分钟我就可以接受了:p下划线方式只是一种低效的书写方式,typeof obj===“number”
@brbcoding你看:。这种类型的运营商在Safari和Firefox中大约快50到100倍,在mobile Safari中大约快300倍。但是,isNaN方法接受字符串和对象,其toString方法返回合适的值,而typeof不返回合适的值。低级别响应的可能重复:在数学中(因此在JavaScript中,表面上),当某个值为null时,它有一个空值,或一个值为零。零是一个有限数。因此,null是有限的。除非你能第一个找到无穷大的倒数,否则我怀疑这种情况永远不会改变。谢谢,真的。充分披露:我不在数学领域,所以我不是专家。泰勒不同意,空!=数学中的0,“null的值不是0”。在统计学和概率论领域,这是一个重要的区别。其他示例:在图形2D(x-y轴)中标记x
;x=0是一个点,在第0行上做一个点,x=null=∅, 这就是没有价值,没有意义,没有点。。也许JS,这是正确的。。但不是在数学上。克罗克福德的isFinite是不一致的思想:Crockford\u isFinite(Number(null))===true
;-)为什么要为someInput!=南
?JavaScript中的所有值都被定义为不等于NaN,包括NaN。@ChrisHayes应明确地像标准所说的那样。效率较低,但更清晰。您应该在代码中添加注释,并对这一点稍加说明。保持原样可能会导致不熟练的编码人员出错。最好使用默认函数isNaN
,注释掉someInput!=NaN
部分,并用两个词解释为什么动态生成NaN
以及为什么它与NaN
本身不相等。不过只是一些建议。@LightStyle完成了,我保持了函数不变,但在下面添加了一条注释//true
作为true被视为1
alert(isFinite(' ')); //true
alert(isFinite('')); //true
alert(isFinite(null)); //true
alert(isFinite(!undefined)); //true