Оператор typeof
является изворотливым, в основном. Here is the documentation in the spec. Из этой таблицы вы можете видеть, что оператор просто определен таким образом, что результатом typeof null
является «объект».
В JavaScript null
действительно в своем собственном виде. Это особый примитивный тип.
JavaScript-примитивные типы действительно не объекты. Иногда они кажутся объектами, потому что семантика языка (в частности, семантика операторов .
и [ ]
) такова, что примитивы автоматически «помещаются» в объекты с соответствующим типом. Это верно для булевых, числовых и строковых примитивов. Для null
такого типа объекта не существует.
Из-за того,
var len = "some string".length;
работает, даже если строка примитивы не имеют свойство «длина».
Еще одна вещь: использовать функцию «toString» в прототипе объекта как нечто вроде «улучшенной» версии typeof
.
alert(Object.prototype.toString.call(null)); // [object Null]
Строка, что функция возвращает не являются наиболее удобными вещами, чтобы иметь дело с, но они обеспечивают немного более тонкую детализацию, чем typeof
.
Удовлетворительный факт - 'typeof null' является _mistake_, у них был эксперимент, чтобы исправить его некоторое время назад, и это не сработало, потому что слишком много мест полагалось на текущее поведение. –
@BenjaminGruenbaum ну это, безусловно, кажется ошибкой :) – Pointy