Автор оригинала: 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 ссылка Отказ