#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
Комментариев нет:
Отправить комментарий