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

Roy*_*mir 19 javascript jquery

直到最近的版本,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;
Run Code Online (Sandbox Code Playgroud)

题:

在之前的版本中,他们将它改为新版本还不够好?为什么他们检查阵列?

Den*_*ret 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应该真正返回什么(毕竟这个对象确实想要显示为数字).

  • @ A.Wolff我不确定.假设你做了这样一个对象,你可能有充分的理由,所以可能它应该被视为一个数字.当你这样做时,这不是偶然的. (2认同)
  • 来自DOC:`$ .isNumeric()方法检查其参数是否代表数值.看起来确实公平 (2认同)

Nit*_*Nit 6

例如,以前的版本无法正确使用具有单个数字元素的数组:

var obj = [1];
(!isNaN( parseFloat(obj) ) && isFinite(obj)); //true
var obj = [1, 2];
(!isNaN( parseFloat(obj) ) && isFinite(obj)); //false
Run Code Online (Sandbox Code Playgroud)