Рубрики
Без рубрики

NAN, ISNAN () & Number.isnan ()

В этой статье я собираюсь поделиться некоторыми из вещей, которые нам нужно знать о работе с NAN.

Автор оригинала: Diego Palacios Lepore.

Тип номера имеет несколько специальных ценностей, и один из них – Нан Отказ

В этой статье я собираюсь поделиться некоторыми из вещей, которые нам нужно знать о работе с этой специальной стоимостью.

Предлагаю вам попробовать фрагменты кода, когда вы найдете их вдоль статьи.

Наимние сбивает с толку

Давайте сделаем Тип на Нан Чтобы увидеть, что он возвращает:

typeof NaN  // "number"

Как вы можете видеть, он возвращает «номер» как тип, так что это ясно, что Нан на самом деле Номер … подожди секунду, что!? 😮.

Итак, было бы лучше назвать эту особую ценность что-то вроде: «Не допустимое число» или подобное, чтобы избежать путаницы.

Нан Специальное значение представляет какую-то ошибку в Номер набор. Это возвращено, когда мы стараемся сделать математическую операцию, и это не удается. Итак, в этом случае Нан Особое значение возвращается.

Равенство крик

Если мы хотим проверить, сохраняется ли какое-то значение в переменной Нан , используя либо === или == Операторы не будут работать с Нан это единственное значение, которое не равно себе.

const x = 10 / "foo"

x === NaN    // false
x == NaN     // false

NaN !== NaN  // true

Проверка, если значение NAN

Есть два метода, которые могут помочь нам тестировать, если значение является Нан Отказ Мы можем использовать встроенный метод глобального утилита Isnan () или Номер .isnan () полезность. Но вы увидите ниже, почему рекомендуется всегда использовать Номер .isnan () вместо Isnan () Отказ Давайте попробуем их:

const y = Math.sqrt(-1)
const z = "bar"

isNaN(y)   // true
isNaN(z)   // true
isNaN(20)  // false
isNaN("55")// false

Похоже, что Isnan () Утилита принимает Нан буквально как Не число Отказ

Давайте подумаем об этом на мгновение … 🤔

Кажется Isnan () Логика есть что-то, как это: «Если значение прошло (или оценивает) либо специальное значение NAN или что-то, что не имеет значения Номер ( typeof x ), то return true

Однако это явно не точно, потому что, насколько мы знаем Тип нан так что это должно вернуть правда только если мы пройдем то, что есть (или оценивает) особое значение Нан , и это должно вернуть ложь Если значение не имеет значения числа.

Позвольте мне сложить немного больше на это.

Логика должна быть вместо этого что-то подобное: «Если значение прошло буквально значение NAN return True , иначе вернуть false “.

К счастью, есть метод утилиты (замена Isnan ), который имеет значение:

const a = 20 / "foo"
const b = "bar"
const c = 35
const d = {}

Number.isNaN(a)   // true
Number.isNaN(b)   // false
Number.isNaN(c)   // false
Number.isNaN(d)   // false

Если вы хотите проверить поддержку браузера для этого встроенного метода утилиты, вы можете перейти к Могу ли я использовать: Number.isnan Отказ

Тем не менее, он имеет глобальную поддержку 94,06%, поэтому нечего беспокоиться здесь. Т.е. не поддерживает его, но все равно почти уходит.

Пара полифилл для числа .isnan

Написание этих полифиллировщиков поможет нам понять эти утилиты немного больше.

if(!Number.isNaN) {
  Number.isNaN = function(n) {
    if( typeof n === "number" ) {
      return window.isNaN(n)
    } 
    return false
  }
}

Так что в этом, мы отфильтровали значение и убедитесь, что он имеет тип Номер , если это так, мы используем Isnan полезность.

Но мы можем использовать еще простое решение, учитывая тот факт, что Нан не равен себе. Посмотрим:

if(!Number.isNaN) {
  Number.isNaN = function(n) {
    return n !== n
  }
}

Дополнительный

Мы также можем использовать Объект. () Метод проверки, являются ли два значения одинаковыми. Это полезно, потому что он охватывает даже угловые случаи, такие как -0//правда (что должно быть false в этом конкретном случае) и охватывает Нан равенство квирка.

Object.is(NaN, NaN)  // true

Если вы хотите узнать больше о Объект Вы можете перейти к этому MDN ссылка Отказ