Why does `isFinite(null) === true`?
Why does `isFinite(null) === true`?
以下是我觉得有意义的例子。
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,为什么?这还有什么影响?
ECMAScript规范(5.1)将isFinite
定义为:
isFinite(数字)
如果参数强制为NaN、+∞或−∞,则返回false,否则返回true。
如果tonnumber (number)为NaN、+∞或−∞,则返回false。
否则返回true
换句话说,isFinite
正在调用传入的任何东西的tonnumber,然后将其与pos/负无穷大或NaN进行比较。
在JavaScript中(注意使用!=
代替更常见的!==
,导致类型强制转换):
function isFinite(someInput) {
return !isNaN(someInput) &&
someInput != Number.POSITIVE_INFINITY &&
someInput != Number.NEGATIVE_INFINITY;
}
(如下面的注释所述,不需要someInput != NaN
,因为NaN
被定义为不等于所有东西,包括它自己)
现在,为什么null
被转换为零(而不是undefined
)?正如TylerH在评论中所说,null
意味着存在一个值,但为空。它的数学表达式是0。undefined
意味着那里没有值,所以当我们试图调用ToNumber
时,我们得到NaN
。
http://www.ecma-international.org/ecma-262/5.1/sec-15.1.2.5
然而,ECMAScript 6带来了一个不可转换的isFinite
作为Number
的属性。Douglas Crockford建议:http://wiki.ecmascript.org/doku.php?id=harmony:number.isfinite
From MDN:
全局isFinite()函数决定传递的值是否为一个有限的数。如果需要,首先将参数转换为a号码。
它被转换成一个数字…
isFinite(null)
isFinite(+null) //convert to a number
isFinite(0) // true because +null or Number(null) = 0
规范说明全局isFinite()
方法将强制将参数转换为数字。
Number.isFinite()
,它不执行此转换。Number.isFinite(null) // false
或者,像lodash和underscore那样…
var _.isFinite = function(obj) {
return isFinite(obj) && !isNaN(parseFloat(obj));
};
isFinite
调用ToNumber
的参数。所以
> Number(null)
0
> Number(document)
NaN
> isFinite(0)
true
> isFinite(NaN)
false
> isFinite(null)
true
> isFinite(document)
false
因为,如果你说
Number(null) === 0
是有限的
参见To Number conversion
也就是说,对于参数类型null
,结果是+0
isFinite
将其参数类型转换为一个数字,如果它已经不是一个数字。本质上你有isFinite(Number(null))
和Number(null) === 0
。
除了null
,您还会发现这些例子很有趣:
alert(isFinite(' ')); //true
alert(isFinite('')); //true
alert(isFinite(null)); //true
alert(isFinite(!undefined)); //true
在JavaScript中发生隐式转换,当将数字与布尔值进行比较时,该转换尝试将bool转换为整数,或将字符串与数字进行比较时,将数字转换为字符串。如果您将任何数据类型视为数字,它将隐式转换为数字,因此上述所有情况都返回零,这是有限的。看到
如果你尝试Number(undefined)
,它会给你一个负的NaN
,这将产生一个有限的1
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- AngularJS-使用'true'属性
- JavaScript-切换“;全部检查”;复选框true/false
- location.reload(true)崩溃浏览器选项卡
- 指令的模板必须只有一个根元素:With restrict E&替换true
- Javascript - element.childNodes does not see an append.newch
- JavaScript:只有当数组中的所有项都为true时才执行函数
- 对于loop.if-仅在经过所有间隔后返回true
- if(foo!==null)的计算结果为true,即使foo为null
- ngIf的计算结果始终为true
- AngularJS ng-init does not work
- 如果函数返回True,则显示Javascript按钮
- (false==false==true)怎么可能是真的
- What does requirejs.config() do?
- Javascript If else 只返回 TRUE 或只返回 FALSE
- sails.js beforeCreate方法只接收required设置为true的模型属性
- 在$state.go之后执行$window.location.reload(true)
- 尝试简化检查对象键是否为true并将其推送到另一个对象
- JavaScript: How does true >> 0 = 1?
- Why does `isFinite(null) === true`?