Чем отличается поведение isnan и number isnan
Русские Блоги
Начните с разницы между Number.isNaN и isNaN
пример
Давайте сначала посмотрим на следующий пример,
Если вы четко понимаете ответ, то можете пропустить эту статью.
Друзья, которые не знают, давайте не спеша проанализируем.
Почему одна и та же функция выглядит по-разному, но почему разные результаты?
Что такое NaN?
Прежде чем объяснять NaN, я хотел бы объяснить несколько сбивающих с толку концепций, таких как тип / значение / переменная. Те, кто уже понимает, могут пропустить этот раздел.
Что такое тип / значение / переменная
В JavaScript существует семь типов значений
Итак, что такое переменная? Наш обычный var То, что после заявления.
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 или нет?
isNaN()
Кто-то может спросить: «Разве не легко судить? Просто сравните это напрямую.
NaN вернет false при сравнении с самим собой.
Следовательно, нам нужна специальная функция, чтобы определить, является ли значение NaN.
Вернемся к приведенному выше примеру
Хорошо, это работает, кажется, идеально, но посмотрите на следующий пример
Вы обнаружите, что очевидно, что значение, отличное от NaN, также ошибочно принимается за NaN.
Эта ОШИБКА существует уже 20 лет, и существует с самого начала JavaScript. Очевидно, что исходный дизайнер при проектировании isNaN () ограничивался буквальным значением слова «Not a Number»: он возвращал true, если это не было числом.
Вернувшись к приведенному выше примеру, можно понять, какая проблема была устранена.
Number.isNaN () полифилл
Без ES6 вы можете использовать следующий полифилл
Проще говоря, он добавляет оценку типа к исходной isNaN (), потому что тип NaN является числом.
Есть более простая реализация
Воспользуйтесь преимуществом того, что только NaN не равно самому себе.
Кстати, расскажите мне о объяснении MDN, он объяснил, что isNaN() из
Он новая функция в ES6 Number.isNaN() Объясните старую функцию на основе isNaN() оф.
Но мы можем объяснить приговор таким образом isNaN() Почему это появляется
ES6 в действии: новые числовые методы
В этой статье рассматриваются новые и улучшенные числовые методы в ES6 (ECMAScript 6).
Number.isInteger ()
Ради интереса я попытался воссоздать эту функцию, и в итоге я использовал другой подход:
number аргумент представляет значение, которое вы хотите проверить.
Некоторые примеры использования этого метода приведены ниже:
Number.isNaN ()
Здесь value — это значение, которое вы хотите проверить. Некоторые примеры использования этого метода показаны ниже:
Как видите, тестируя одни и те же значения, мы получаем разные результаты.
Метод поддерживается в Node и во всех современных браузерах, за исключением Internet Explorer. Если вы хотите поддерживать другие браузеры, очень простой полифилл для этого метода выглядит следующим образом:
Это работает потому, что NaN — единственное нерефлексивное значение в JavaScript, что означает, что это единственное значение, которое не равно самому себе.
Number.isFinite ()
Здесь value — это значение, которое вы хотите проверить. Если вы протестируете те же значения из предыдущего фрагмента, вы увидите, что результаты отличаются:
Number.isSafeInteger ()
Исходя из этого определения, безопасными целыми являются все целые числа от — (2 53 — 1) включительно до 2 53 — 1 включительно. Эти значения важны, и мы обсудим их немного больше в конце этого раздела.
Синтаксис этого метода:
Здесь value — это значение, которое вы хотите проверить. Несколько примеров использования этого метода показаны ниже:
Number.parseInt () и Number.parseFloat ()
Ради полноты я сообщаю об их синтаксисе:
Следующий фрагмент показывает несколько примеров использования:
Эти методы поддерживаются в Node и во всех современных браузерах, за исключением Internet Explorer. Если вы хотите их заполнить, вы можете просто вызвать их связанный глобальный метод, как указано ниже:
Поддержка браузера
На следующем рисунке показана поддержка браузером расширений встроенного объекта Number в ES6. Наведите курсор мыши на поля, чтобы увидеть процент использования соответствующих версий браузера.
Числовые методы ES6: завершение
$.isNumeric vs. isNaN
I don’t see where they will ever return different results.
2 Answers 2
From the jQuery blog:
Inside jQuery we’ve found several situations where we need to know if an argument is numeric, or would be successfully converted to a number if it is some other type. We decided to write and document jQuery.isNumeric() since it’s a useful utility. Pass it an argument of any type and it returns true or false as appropriate.
jQuery.isNaN(): This undocumented utility function has been removed. It was confusing because it appropriated the name of a built-in JavaScript function but did not have the same semantics. The new jQuery.isNumeric() serves a similar purpose, but has the benefit of being documented and supported. Despite jQuery.isNaN() being undocumented, several projects on Github were using it. We have contacted them and asked that they use jQuery.isNumeric() or some other solution.
jQuery’s isNumeric() checks if a value is a number OR can be converted to a number.
EDIT
To further clarify what isNan() does (and what a NaN value is):
A NaN, which means «Not-a-Number», is classified as a primitive value by the ECMA-262 standard and indicates that the specified value is not a legal number. The function returns true if the argument is not a number and false if the argument is a number.
The classic example of a NaN is zero divided by zero, 0/0
Semi offtopic, but related is this short talk
Является ли Number.IsNaN () более нарушенным, чем isNaN ()
Soooooo isNaN явно не работает в JavaScript, с такими вещами, как:
Примеры на MDN говорят:
Number.isNaN ( » блаб » ) ; // например это было бы верно с isNaN
Я не понимаю, как это «Более надежная версия оригинального глобального isNaN». когда я не могу проверить, если вещи не число.
Черновик ES3 здесь в основном гласит, что все всегда ложно, кроме с его Number.NaN
Кто-нибудь еще находит, что это сломано, или я просто не понимаю смысла исНана?
11 ответов
Причина, по которой все приведенные выше тесты возвращают false, заключается в том, что все заданные значения можно преобразовать в числовое значение, которое не является NaN :
Я использую простой обходной путь для проверки Number.isNaN ():
Просто, не правда ли?
Более того, онлайн-тесты говорят, что Number.isNaN легче, чем isNaN.
Чтобы определить, является ли что-то число числом, требуется синтаксический анализ, который успешно завершается в широком диапазоне нечисловых входов, успешно обнаруживая числа и строки, представляющие числа, следовательно:
Следующее работает, потому что NaN является единственным значением в javascript, которое не равно самому себе.
Number.isNaN(x) проверяет, оценивается ли x непосредственно NaN или нет.
Итак, хорошее правило:
По сути, window.isNaN выполняет преобразование типа в число, а затем проверяет, является ли оно NaN. Принимая во внимание, что Number.isNaN не пытается преобразовать свой аргумент в число. В общем, вы можете думать о window.isNaN и Number.isNaN как о такой работе.
Основное различие между ними состоит в том, что глобальная функция isNaN(x) выполняет преобразование параметра x в число. Так
Потому что Number(«blabla») приводит к NaN
Здесь есть два определения «не числа», и, возможно, именно в этом и заключается путаница. Number.isNaN(x) только возвращает true для определения спецификации IEEE 754 с плавающей точкой Not a Number, например:
В отличие от определения, имеет ли передаваемый объект числовой тип или нет. Вот несколько способов сделать это:
Если вы хотите проверить, является ли значение на самом деле конечным числом, вы можете использовать:
Если вы хотите проверить, является ли значение конечным числом или строковым представлением единицы, вы можете использовать:
Используйте, если вы хотите проверить, что значение NaN и type число.
истина, если заданное значение равно NaN; иначе ложно.
Используйте, когда вы хотите проверить значение просто NaN.
Определяет, представляет ли его аргумент число JavaScript.
Используйте, если вы хотите проверить, является ли значение числом или может быть преобразовано в число.
@phill, как указано в других ответах, ни один не сломан.
Правдоподобным решением было бы сделать что-то вроде:
Возможности современного JavaScript, о которых вы могли не знать
Несмотря на то, что в последние семь лет я пишу на JavaScript почти каждый рабочий день, должен признаться, что уделяю мало внимания сообщениям о нововведениях от ES. Главные возможности вроде async/await и прокси — это одно, но ещё каждый год идёт поток мелких поэтапных изменений, которые не попадают в моё поле зрения, поскольку всегда находится что-то более важное для изучения.
В этой статье я собрал возможности современного JS, о которых мало говорили, когда они появились. Некоторые из них всего лишь повышают удобство, а некоторые невероятно практичны и могут сэкономить написание кучи кода.
ES2015
Двоичные и восьмеричные литералы
В JavaScript не часто приходится пользоваться двоичным манипулированием. Но иногда возникают задачи, которые иначе не решить. Например, когда пишешь высокопроизводительный код для слабых устройств, втискиваешь биты в локальное хранилище, выполняешь пиксельные RGB-манипуляции в браузере или работаешь с тесно упакованными двоичными форматами данных.
Это сильно упрощает работу с двоичными флагами:
Number.isNaN()
У классического isNaN есть несколько интересных хитростей:
Сигнатура: Number.isNaN : (value: any) => boolean
ES2016
Оператор возведение в степень
Время от времени такое случается, так что хорошо иметь под рукой литеральный синтаксис для возведения в степень:
Странно, но я был уверен, что в JavaScript такое уже есть. Возможно, спутал с Python.
Array.prototype.includes()
Сигнатура: Array.prototype.includes : (match: any, offset?: Int) => boolean
ES2017
Разделяемые память и атомарные операции
Это пара замечательных возможностей, которые просто бесценны, если нужно выполнить много работы с помощью веб-воркеров. Вы можете напрямую делиться памятью с несколькими процессами и задавать блокировки, чтобы избежать состояния гонки.
Это две большие возможности с довольно сложными API, так что здесь я их описывать не буду. За подробностями отправляю вас к этой статье: https://www.sitepen.com/blog/the-return-of-sharedarraybuffers-and-atomics/. Еще не все браузеры поддерживают эти функции, но надеюсь, что в ближайшие пару лет ситуация улучшится.
ES2018
Золотая жила регулярных выражений
В ES2018 появилась целая россыпь новых возможностей регулярных выражений:
Lookbehind-сопоставления (сопоставление с предыдущими символами)
В тех средах исполнения, которые это поддерживают, вы теперь можете писать регулярные выражения, которые ищут символы до того, что вы сопоставляете. Например, чтобы найти все числа, перед которыми стоит знак доллара:
Всё дело в новой lookbehind-группе, близнеце lookahead-групп:
К сожалению, сегодня нельзя транспилировать новый lookbehind-синтаксис под старые браузеры, так что вполне возможно, какое-то время вы сможете использовать его только в Node.
Именованные группы захвата
Теперь регулярные выражения могут выбирать подвыборки и использовать для простого парсинга. До недавнего времени мы могли ссылаться на такие фрагменты только по числам, например:
К сожалению, сейчас это работает только в Chrome и Node.
Теперь точки могут отмечать новые строки
ES2019
Array.prototype.flat() и flatMap()
Я был очень рад увидеть это в MDN.
Попросту говоря, flat() преобразует многомерный массив в одномерный на заданную максимальную глубину ( depth ):
Неограниченные перехваты
Теперь вы можете писать выражения try/catch без привязки к киданию ошибок: