Подтвердить что ты не робот

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;

Вопрос:

Что было плохого в предыдущей версии, что они изменили ее на новую? И почему они проверяют массив?

4b9b3361

Ответ 1

То же самое значение obj отвечает на ваши вопросы: [3]

!isNaN( parseFloat(obj) ) && isFinite( obj ) true для [3].

(obj - parseFloat(obj) + 1) >= 0 составляет true для [3].

Причина этих проблем заключается в том, что преобразование в строку или число происходит в parseFloat и в isFinite и что преобразование в строку массива является результатом объединения с запятой преобразования его элементов в строки.

Итак, это изменение является исправлением ошибки.

Обратите внимание, что вы все равно можете "сбой" со значениями, такими как {toString:function(){ return 3}}, но неясно, какой jQuery должен действительно возвратиться в таком случае (этот объект действительно хочет выглядеть как число, в конце концов).

Ответ 2

Предыдущая версия, например, неправильно работала для массивов с одним числовым элементом:

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