EloquentJavaScript:! Number.isNaN (), в чем цель? [Дубликат]

Контейнеры Python содержат ссылки на другие объекты. См. Этот пример:

>>> a = []
>>> b = [a]
>>> b
[[]]
>>> a.append(1)
>>> b
[[1]]

В этом b есть список, содержащий один элемент, который является ссылкой на список a. Список a изменен.

Умножение списка на целое эквивалентно добавлению списка к себе несколько раз (см. операции общей последовательности ). Итак, продолжаем с примера:

>>> c = b + b
>>> c
[[1], [1]]
>>>
>>> a[0] = 2
>>> c
[[2], [2]]

Мы видим, что список c теперь содержит две ссылки на список a, который эквивалентен c = b * 2.

Python FAQ также содержит объяснение этого поведения: Как создать многомерный список?

38
задан Phill 7 August 2014 в 08:22
поделиться

9 ответов

isNaN() и Number.isNaN() оба теста, если значение (или, в случае isNaN(), могут быть преобразованы в числовое значение, которое представляет) значение NaN. Другими словами, «NaN» не просто означает, что «это значение не является числом», это конкретно означает «это значение является числовым значением Not-a-Number в соответствии с IEEE-754».

Причина, по которой все ваши тесты выше, возвращает false, потому что все указанные значения могут быть преобразованы в числовое значение, которое не является NaN:

Number('')    // 0
Number('   ') // 0
Number(true)  // 1
Number(false) // 0
Number([0])   // 0

Причина isNaN() «сломан», потому что, якобы, преобразования типов не должны происходить при тестировании значений. Это проблема Number.isNaN(), предназначенная для решения. В частности, Number.isNaN() будет только попытаться сравнить значение с NaN, если значение представляет собой числовое значение. Любой другой тип будет возвращать false, даже если они буквально «не являются числом», потому что тип значения NaN является числом. См. Соответствующие MDN-документы для isNaN() и Number.isNaN() .

Если вы просто хотите определить, имеет ли значение номер type, , даже если это значение NaN , вместо этого используйте typeof:

typeof 'RAWRRR' === 'number' // false
54
ответ дан BoltClock 21 August 2018 в 06:00
поделиться
  • 1
    Чистейшее объяснение, которое я видел до сих пор. – lux 20 October 2016 в 15:20
  • 2
    Я бы рекомендовал: typeof value === 'number' && !isNaN(value). Потому что typeof NaN === 'number'. – James 21 January 2017 в 05:28
  • 3
    Разочарование того, что они представили другой метод для проверки NaN, который нарушается многими способами (и в некоторых новых для загрузки). – d512 16 May 2017 в 18:03
  • 4
    @ d512 Очевидно, что вы не поняли этот ответ, потому что вся точка зрения заключается в том, что isNaN не & quot; broken & quot ;. Он не проверяет, является ли значение числовым (вы можете использовать parseInt или jQuery $.isNumeric для этого) - isNaN фактически проверяет, является ли значение NaN, что является специальным значением с очень конкретным значение в JavaScript. – Sean the Bean 22 May 2017 в 17:41
  • 5
    @ d512: Просто потому, что у вас нет личного варианта проверки того, что значение NaN не делает его плохим алгоритмом или сломанным. Возможно, вы могли бы предложить добавление функции Number.isNumeric (), хотя я был бы удивлен, если бы никто не делал этого уже. – BoltClock♦ 26 June 2017 в 08:51

В основном, window.isNaN выполняет преобразование типа в число, а затем проверяет, является ли оно NaN. Принимая во внимание, что Number.isNaN не пытается преобразовать свой аргумент в число. Итак, вы можете думать, что window.isNaN и Number.isNaN работают так.

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

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

Обратите внимание, что вам действительно не нужно window. для вызова isNaN или Number.isNaN. Скорее, я просто использую его для лучшего различия между двумя аналогично названными методами, чтобы попытаться сбить путаницу.

~ Happy Coding!

0
ответ дан Jack Giffin 21 August 2018 в 06:00
поделиться

Нет, оригинал isNaN сломан. Вы не понимаете точку isNaN.

Цель обеих этих функций - определить, имеет ли что-то значение NaN. Это обеспечивается, потому что something === NaN всегда будет false и поэтому не может быть использован для проверки этого. (сторона примечания: something !== something на самом деле является надежным, хотя и интуитивно понятным, тестом для NaN)

Причина isNaN нарушена в том, что она может возвращать true в случаях, когда значение на самом деле NaN. Это связано с тем, что оно сначала зацикливает значение на число.

Таким образом,

isNaN("hello")

является true, хотя "hello" не NaN.

Если вы хотите проверить, действительно ли значение является конечным числом, вы можете использовать:

Number.isFinite(value)

Если вы хотите проверить, является ли значение конечным числом или строковым представлением одного, вы можете использовать:

Number.isFinite(value) || (Number.isFinite(Number(value)) && typeof value === 'string')
14
ответ дан JLRishe 21 August 2018 в 06:00
поделиться

Как указано в комментарии isNaN() и Number.isNaN(), оба проверяют, что значение, которое вы передаете, не равно значению NaN. Ключ здесь состоит в том, что NaN является фактическим значением, а не оцененным результатом, например. "blabla" является String, а значение равно "blabla", что означает, что это не значение "NaN".

Правдоподобное решение будет делать что-то вроде:

Number.isNaN(Number("blabla")); //returns true.
5
ответ дан kaspermoerch 21 August 2018 в 06:00
поделиться
  • 1
    Ваше решение все еще не работает в таких случаях, как Number.isNaN(Number(" ")). – JLRishe 7 August 2014 в 08:39
  • 2
    @JLRishe Это правильно. – kaspermoerch 7 August 2014 в 08:45

Следующее работает, потому что NaN является единственным значением в javascript, который не равен самому себе.

Number.isNaN = Number.isNaN || function(value) {     
    return value !== value;
}
0
ответ дан sendon1982 21 August 2018 в 06:00
поделиться

1. Number.isNaN

alert(Number.isNaN('Hello')); // false 

Не должен ли он вернуться true, потому что Hello является string и его Not A Number вправо? Но знает, почему он возвращает false.

MDN docs говорит:

true, если данное значение является NaN, а его тип - Number ; в противном случае false.

Да Hello значение NaN, но тип string, вы можете проверить тип следующим образом:

alert(typeof `Hello`);  // string

Использование:

Используйте, когда вы хотите проверить значение, оба NaN и type являются цифрами.

2. isNaN

alert(isNaN('Hello')); // true

MDN docs говорит:

true, если заданное значение NaN; в противном случае false.

Использование:

Использовать, когда вы хотите проверить значение, это просто NaN.

3. jQuery.isNumeric ()

JQuery Docs Says:

Определяет, указывает ли его аргумент номер JavaScript.

alert($.isNumeric('Hello')); // false
alert($.isNumeric(3)); //true

Использование:

Использование, когда вы хотите проверить значение, является числом или может быть преобразовано в число.

Ссылка

1
ответ дан stom 21 August 2018 в 06:00
поделиться

Ключевое различие между ними состоит в том, что глобальная функция isNaN(x) выполняет преобразование параметра x в число. Итак,

isNaN("blabla") === true

, потому что Number("blabla") приводит к NaN

. Здесь есть два определения «не число», и, возможно, это где-то путаница. Number.isNaN(x) возвращает true только для определения спецификации Notification Number с плавающей точкой IEEE 754, например:

Number.isNaN(Math.sqrt(-1))

, а не для определения, является ли передаваемый объект числовым или нет. Некоторые способы сделать это:

typeof x === "number"
x === +x
Object.prototype.toString.call(x) === "[object Number]"
5
ответ дан Tom Fenech 21 August 2018 в 06:00
поделиться
0
ответ дан aMarCruz 1 November 2018 в 01:17
поделиться
0
ответ дан George 1 November 2018 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: