Контейнеры 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 также содержит объяснение этого поведения: Как создать многомерный список?
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
В основном, 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!
Нет, оригинал 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')
Number.isFinite(parseFloat('1f'))
возвращает true
– Gabriel Florit
26 December 2015 в 05:59
Как указано в комментарии isNaN()
и Number.isNaN()
, оба проверяют, что значение, которое вы передаете, не равно значению NaN
. Ключ здесь состоит в том, что NaN
является фактическим значением, а не оцененным результатом, например. "blabla"
является String
, а значение равно "blabla"
, что означает, что это не значение "NaN"
.
Правдоподобное решение будет делать что-то вроде:
Number.isNaN(Number("blabla")); //returns true.
Number.isNaN(Number(" "))
.
– JLRishe
7 August 2014 в 08:39
Следующее работает, потому что NaN является единственным значением в javascript, который не равен самому себе.
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
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
Использование:
Использование, когда вы хотите проверить значение, является числом или может быть преобразовано в число.
Ключевое различие между ними состоит в том, что глобальная функция 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]"
typeof value === 'number' && !isNaN(value)
. Потому чтоtypeof NaN === 'number'
. – James 21 January 2017 в 05:28isNaN
не i> & quot; broken & quot ;. Он не проверяет, является ли значение числовым (вы можете использоватьparseInt
или jQuery$.isNumeric
для этого) -isNaN
фактически проверяет, является ли значениеNaN
, что является специальным значением с очень конкретным значение в JavaScript. – Sean the Bean 22 May 2017 в 17:41