直到最近的版本,jQuery用于检查数字是否通过:
return !isNaN( parseFloat(obj) ) && isFinite( obj );
第一个部分用于:
parseFloat("d") //Nan
!isNaN( parseFloat(Infinity)) //true but not a number
第二个部分用于:
isFinite('2') //true
但是在最近的版本中,他们更改了它并将其更改为:
return !jQuery.isArray(obj) && (obj - parseFloat(obj) + 1) >= 0;
问题:
在之前的版本中不够好,他们将其更改为新版本?为什么他们检查数组?
答案 0 :(得分:16)
obj
的相同值会回答您的问题:[3]
!isNaN( parseFloat(obj) ) && isFinite( obj )
, true
为[3]
。
(obj - parseFloat(obj) + 1) >= 0
, true
为[3]
。
这些问题背后的原因是在parseFloat
和isFinite
中转换为字符串或数字,并且转换为数组的字符串是使用逗号加入其转换的结果元素到字符串。
所以这个改变是一个bug修复。
请注意,你仍然可以使它失败"使用像{toString:function(){ return 3}}
这样的值,但是在这种情况下它不清楚jQuery应该返回什么(这个对象真的希望显示为数字,毕竟)。
答案 1 :(得分:6)
例如,以前的版本无法正确使用具有单个数字元素的数组:
var obj = [1];
(!isNaN( parseFloat(obj) ) && isFinite(obj)); //true
var obj = [1, 2];
(!isNaN( parseFloat(obj) ) && isFinite(obj)); //false