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
表示存在一个值,但为空。它的数学表示为0
undefined
意味着那里没有值,因此我们在尝试调用
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