Почему isNaN (пустой) == ложь в JS?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

116
задан H. Pauwelyn 29 August 2019 в 06:28
поделиться

6 ответов

Я полагаю, что код пытается спросить, "x числовые?" с конкретным случаем здесь x = null. Функция isNaN() может использоваться для ответа на этот вопрос, но семантически это относится конкретно к значению NaN. Из Википедии для [1 126] NaN :

NaN ( Not умбра N) является значением типа числовых данных, представляющего неопределенное или непредставимое значение, особенно в вычислениях с плавающей точкой.

В большинстве случаев мы думаем, что ответ на "пустой числовой?" должен быть нет. Однако isNaN(null) == false семантически корректно, потому что null не NaN.

Вот алгоритмическое объяснение:

функция isNaN(x) попытки преобразовать переданный параметр в число <глоток> 1 (эквивалентный Number(x)) и затем тестируют, если значение NaN. Если параметр не может быть преобразован в число, Number(x) возвратится NaN <глоток> 2 . Поэтому, если преобразование параметра x к числу приводит к [1 114], это возвращает true; иначе это возвращает false.

Так в конкретном случае x = null, null преобразовывается в номер 0, (попытайтесь оценить Number(null) и посмотрите, что это возвращается 0) и isNaN(0) возвращает false. Строка, которая является только цифрами, может быть преобразована в число, и isNaN также возвращает false. Строка (например, 'abcd'), который не может быть преобразован в число, заставит isNaN('abcd') возвращать true, конкретно потому что Number('abcd') возвраты NaN.

В дополнение к этим очевидным пограничным случаям стандартные числовые причины возврата NaN как 0/0.

Что касается на вид непоследовательных тестов для равенства, показанного в вопросе, поведение [1 123] определяется таким образом, что любое сравнение x == NaN является ложью, независимо от другого операнда, включая [1 125] самого <глоток> 1 .

107
ответ дан Glenn Moss 24 November 2019 в 02:18
поделиться

(Мой другой комментарий проявляет практический подход. Вот теоретическая сторона.)

я искал стандарт ECMA 262 , который является тем, что реализует JavaScript. Их спецификация для isNan:

Применяет ToNumber к его аргументу, затем возвращает true, если результат является NaN, и иначе возвращает false.

Раздел 9.3 определяет поведение ToNumber (который не является вызываемой функцией, а скорее компонентом системы преобразования типов). Для суммирования таблицы определенные входные типы могут произвести NaN. Это тип undefined, тип number (но только значение NaN), любой объект, примитивное представление которого NaN, и любой string, который не может быть проанализирован. Это уезжает undefined, NaN, new Number(NaN), и большинство строк.

Любой такой вход, который производит NaN как вывод, когда передано [1 110], произведет true, когда питается к [1 112]. С тех пор null может успешно быть преобразован в число, оно не производит true.

И именно поэтому.

7
ответ дан treat your mods well 24 November 2019 в 02:18
поделиться

Это является действительно тревожащим. Вот массив значений, которые я протестировал:

var x = [undefined, NaN, 'blah', 0/0, null, 0, '0', 1, 1/0, -1/0, Number(5)]

Это оценивает (в консоли Firebug) к:

,NaN,blah,NaN,,0,0,1,Infinity,-Infinity,5

, Когда я звоню x.map(isNaN) (для вызова isNaN на каждом значении), я добираюсь:

true,true,true,true,false,false,false,false,false,false,false

В заключение isNaN довольно бесполезные взгляды! ( Редактирование : Кроме него оказывается, что isNaN [только 116] определили по Числу, в этом случае это работает просто великолепно - только с вводящим в заблуждение именем.)

Кстати, вот типы тех значений:

x.map(function(n){return typeof n})
-> undefined,number,string,number,object,number,string,number,number,number,number
7
ответ дан treat your mods well 24 November 2019 в 02:18
поделиться

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

5
ответ дан gizmo 24 November 2019 в 02:18
поделиться

Я не абсолютно уверен когда дело доходит до JS, но я видел подобные вещи на других языках, и это обычно, потому что функция только проверяет, равен ли пустой указатель точно NaN (т.е. пустой === NaN был бы ложью). Другими словами не то, чтобы это думает, что пустой указатель является на самом деле числом, но это скорее, что пустым указателем не является NaN. Это, вероятно, потому что оба представлены по-другому в JS так, чтобы они не были точно равны, таким же образом это 9! == '9'.

1
ответ дан Jason Tennier 24 November 2019 в 02:18
поделиться

Примечание:

"1" == 1 // true
"1" === 1 // false

== оператор делает преобразование типов, в то время как === не делает.

веб-сайт Douglas Crockford , Yahoo! евангелист JavaScript, является большим ресурсом для материала как это.

0
ответ дан cllpse 24 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

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