Из разницы между Number.isNaN и isNaN

JavaScript

пример

Давайте посмотрим на следующий пример,

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 существует семь типов значений.

  1. null
  2. undefined
  3. boolean
  4. number
  5. string
  6. object
  7. символ (новое в 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

В этом случае.

Блог автора

Автор Weibo