пример
Давайте посмотрим на следующий пример,
isNaN(NaN);
isNaN('A String');
isNaN(undefined);
isNaN({});
Number.isNaN(NaN);
Number.isNaN('A String');
Number.isNaN(undefined);
Number.isNaN({});
Если вы можете четко ответить, то можете пропустить эту статью.
Если вы не знаете, давайте проведем медленный анализ.
Ответ таков:
isNaN(NaN); // true
isNaN('A String'); // true
isNaN(undefined); // true
isNaN({}); // true
Number.isNaN(NaN); // true
Number.isNaN('A String'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Зачем смотреть одну и ту же функцию, почему результат разный?
Что такое NaN?
Прежде чем объяснять NaN, я хочу объяснить несколько запутанных концепций типа/значения/переменной.Друзья, которые уже разобрались, могут пропустить этот раздел.
что такое тип/значение/переменная
В JavaScript существует семь типов значений.
- null
- undefined
- boolean
- number
- string
- object
- символ (новое в ES6)
Итак, что такое переменная? что мы обычноvarДело после заявления.
Отношения между типом, значением, переменной можно сказать так: переменная является контейнером для хранения значения, а значение имеет понятие типа, но переменная-контейнер не имеет понятия типа, например
var a = 'foo';
контейнерная переменнаяaзагруженный ценностью'foo', value 'foo'Тип строки
NaN
Это описано в MDN
The global NaN property is a value representing Not-A-Number.
Это значит:NaNэто значение, помещенное в глобальный (окно в браузере) объект, который является представлениемNot-A-Numberстоимость.
Смысл пока неясен.
Потом читаем описание в книге бога "Ты не знаешь JS"
NaN literally stands for "not a number", though this label/description is very poor and misleading, It would be much more accurate to think of NaN as being "invalid number," "failed number," or even "bad number," than to think of it as "not a number."
В соответствии с резюме знаний, мы знаем, что NAN является значением, это значение имеет номер типа.
Но в отличие от обычного значения, тип которого — число, NaN представляет значение «Не число».
Итак, вопрос в том, как определить, является ли значение NaN?
isNaN()
Кто-то может сказать, разве не легко судить? Лучше сравнивать напрямую.
NaN === NaN // false
Сравнение NaN с самим собой возвращает false.
Поэтому нам нужна специальная функция, чтобы определить, является ли значение NaN.
isNaN()Оно родилось из ниоткуда.
Вернемся и посмотрим на пример выше
isNaN(NaN); // true
ОК, сработало, вроде идеально, но тогда посмотрите на следующий пример
isNaN('A String'); // true
isNaN(undefined); // true
isNaN({}); // true
Вы обнаружите, что значение, которое явно не является NaN, также ошибочно принимается за NaN.
Эта ошибка существует уже 20 лет, с самого начала JavaScript. Очевидно, что первоначальный дизайнер при разработке isNaN() ограничивался буквальным значением «Не число»: пока это не число, оно вернет true.
Так что ES6 был введен для восполнения этой ошибки (вместо исправления, потому что isNaN существует слишком долго, и возможно, что многие функции основаны на этой ошибке)Number.isNaN().
Number.isNaN(NaN); // true
Number.isNaN('A String'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Оглядываясь назад на пример выше, становится ясно, что было исправлено.
Полифилл для Number.isNaN()
При отсутствии ES6 можно использовать следующие полифиллы
if (!Number.isNaN) {
Number.isNaN = function(n) {
return (
typeof n === "number" &&
window.isNaN( n )
);
};
}
Проще говоря, суждение о типе добавляется на основе исходного isNaN(), поскольку типом NaN является число.
Есть более простая реализация
if (!Number.isNaN) {
Number.isNaN = function(n) {
return n !== n;
};
}
Воспользуйтесь тем, что только NaN не равны сами себе.
Кстати, давайте поговорим об объяснении MDN, он объяснил это такisNaN()из
You could think of isNaN as:
var isNaN = function(value) { return Number.isNaN(Number(value)); }
Он новая функция в ES6Number.isNaN()на основе , чтобы объяснить старую функциюisNaN()из.
Однако мы можем объяснить суждение вышеописанным образом.isNaN()Почему это появляется
isNaN('A String'); // true
isNaN(undefined); // true
isNaN({}); // true
В этом случае.