jQuery改变了isNumeric(最新版本)?

直到最近的版本,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; 

题:

在之前的版本中,他们将其更改为新版本还不够好 ? 为什么他们检查arrays?

obj的相同值回答了你的问题: [3]

!isNaN( parseFloat(obj) ) && isFinite( obj )对于[3]true

(obj - parseFloat(obj) + 1) >= 0对于[3]true

这些问题背后的原因是在parseFloatisFinite转换为字符串或数字,并且转换为数组的字符串是使用逗号将其元素转换为字符串的结果。

所以这个改变是一个bug修复。

请注意,您仍然可以使用{toString:function(){ return 3}}等值使其“失败”,但是在这种情况下还不清楚jQuery应该返回什么(此对象确实希望显示为数字,毕竟) 。

例如,以前的版本不适用于具有单个数字元素的数组:

 var obj = [1]; (!isNaN( parseFloat(obj) ) && isFinite(obj)); //true var obj = [1, 2]; (!isNaN( parseFloat(obj) ) && isFinite(obj)); //false