JQuery изменение isNumeric (в последних версиях)?
До недавней версии jQuery использовался для проверки числа с помощью:
return !isNaN( parseFloat(obj) ) && isFinite( obj );
Первая часть предназначена для:
-
parseFloat("d") //Nan
-
!isNaN( parseFloat(Infinity)) //true but not a number
Вторая часть предназначена для:
Но в последней версии они изменили его и изменили на:
return !jQuery.isArray(obj) && (obj - parseFloat(obj) + 1) >= 0;
Вопрос:
Что было плохого в предыдущей версии, что они изменили ее на новую? И почему они проверяют массив?
Ответы
Ответ 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