Первая часть вопроса:
Почему ноль считается объектом в JavaScript?
Это ошибка разработки JavaScript, которую они не могут исправить сейчас. Это должен был быть тип null, а не тип object или его не должно быть вообще. Это требует дополнительной проверки (иногда забываемой) при обнаружении реальных объектов и является источником ошибок.
Вторая часть вопроса:
Проверяет
if (object == null)
Do something
так же, как
if (!object)
Do something
Обе проверки всегда ложны, кроме:
объект не определен или имеет значение null: оба true.
объект является примитивным, и 0, ""
или false: первая проверка false, вторая true.
Если объект не примитив, а реальный объект, такой как new Number(0)
, new String("")
или new Boolean(false)
, тогда обе проверки ложны.
Таким образом, если «объект» интерпретируется как означающий реальный объект, то обе проверки всегда одинаковы. Если примитивы разрешены, то проверки различны для 0, ""
и false.
В таких случаях, как object==null
, неочевидные результаты могут быть источником ошибок. Использование ==
не рекомендуется никогда, используйте вместо него ===
.
Третья часть вопроса:
А также:
В чем разница между нулевым и неопределенным?
В JavaScript одно отличие состоит в том, что null имеет тип object, а undefined имеет тип undefined.
В JavaScript null==undefined
имеет значение true и считается равным, если тип игнорируется. Почему они решили, что 0, ""
и false не равны, я не знаю. Это кажется произвольным мнением.
В JavaScript null===undefined
неверно, так как тип должен быть одинаковым в ===
.
В действительности, null и undefined идентичны, поскольку оба они представляют небытие. То же самое можно сказать и о 0, и ""
, и, возможно, о пустых контейнерах []
и {}
. Так много типов одного и того же ничего - рецепт ошибок. Один тип или нет вообще лучше. Я бы постарался использовать как можно меньше.
'false', 'true' и '!' Это еще одна сумка червей, которую можно упростить, например, достаточно только if(!x)
и if(x)
, вам не нужны истина и ложь.
Объявленный var x
является типом undefined, если значение не задано, но оно должно быть таким же, как если бы x никогда не был объявлен вообще. Другой источник ошибок - пустой контейнер ничего. Так что лучше всего объявить и определить это вместе, как var x=1
.
Люди ходят кругами по кругу, пытаясь выяснить все эти разные типы ничего, но это все одно и то же в сложной различной одежде. Реальность такова
undefined===undeclared===null===0===""===[]==={}===nothing
А может, все должны выбросить исключения.