Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Почему true==null и false==null оба дают false?

#javascript


Что не так с моими Firefox и Chrome – в обоих браузерах простой тест выдаёт противоречащий
здравому смыслу и спецификациям результат:

[ true == null, false == null]
/*
false,false
*/


От перестановки мест результат не меняется. Точно та же картина с undefined:

[ undefined == true, undefined == false, undefined == null]
/*
false,false,true
*/


Если создавать объекты типа Boolean, всё становится как положено:

[ new Boolean(null) == true, new Boolean(null) == false]
/*
false,true
*/

    


Ответы

Ответ 1



Потому что The Abstract Equality Comparison Algorithm требует, если Type(x) или Type(y) являются Boolean при сравнении x == y, тогда Boolean должно быть приведено числу с помощью ToNumber, которое конвертирует true в 1 и false в +0. Если по простому, то в JS нету соответствия между bool и null. null в JS это тип. Поэтому сравнивая его с чем-то другим вы всегда получите false.

Ответ 2



Потому что в Javascript undefined, null, true и false - это 4 совершенно разных значения. При преобразовании в boolean первые два превращаются в false, так же как 0 и "" - но это не означает, что они равны false!

Ответ 3



Это просто надо принять к сведению. Это так называемое "темное" место языка. Оно "темное", потому что другие подходы не менее логичны, чем принятый. И принятое соглашение не выглядит безупречным. Например в предложении if-else if ( null ) alert( true ); else alert( false ); будет выведено false. Или рассмотрите другой пример var nullValue = Boolean(null); alert("nullValue == false is " + (nullValue == false)); Результатом будет true. При использовании оператора равенства типы null и undefined не преобразуются в другие типы и равны только самим себе или друг другу. Поэтому единственные сравнения за исключением сравнений с самими собой где результат сравнения равен true, это следующие сравнения: alert("null == undefined is " + ( null == undefined )); // true alert("undefined == null is " + (undefined == null)); // true

Комментариев нет:

Отправить комментарий