Согласно http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf, JavaScript имеет 6 типов: undefined
, null
, boolean
, string
, number
и object
.
var und;
console.log(typeof und); // <-- undefined
var n = null;
console.log(typeof n); // <--- **object**!
var b = true;
console.log(typeof b); // <-- boolean
var str = "myString"
console.log(typeof str); // <-- string
var int = 10;
console.log(typeof int); // <-- number
var obj = {}
console.log(typeof obj); // <-- object
Вопрос 1:
Почему пустой указатель типа object
вместо null
?
Вопрос 2:
Что относительно функций?
var f = function() {};
console.log(typeof f); // <-- function
Переменная f
имеет тип function
. Почему это не указано в спецификации как отдельный тип?
Спасибо,
About typeof null == 'object'
, это ошибка, которая возникает с самого начала, и, к сожалению, эта ошибка останется с нами в течение долгого времени, было слишком поздно для исправления в ECMAScript 5th Edition Specification.
Что касается функций , они просто объекты,но у них есть специальное внутреннее свойство с именем [[Call]]
, которое используется внутри при вызове функции.
Оператор typeof
различает простые объекты и функции, просто проверяя, имеет ли объект это внутреннее свойство.
typeof null === "объект"
, потому что так сказано в спецификации, но это ошибка самой первой версии JavaScript. (как сказал Кенни TM выше).
typeof f === "function"
, потому что без try
/ catch
не существует другого надежного и надежного способа определить, можно ли что-то вызвать. Использование f.constructor === Функция
может работать , но я думаю, что это не гарантировано.
Ответ на вопрос 1:
Свойство, если у него нет определения, не определено. Причина, по которой null является объектом, заключается в том, что свойство может существовать без значения, но все же иметь определение.
Для полноты заметьте, что текущий лучший способ проверки информации о типе выглядит примерно так:
var typeInfo = Object.prototype.toString.call(yourObject);
Это дает вам строку, которая выглядит как «[объект Something]», где «Something» - это имя типа.
null - это специальное значение - оно не является ложным, это не 0, или пустая строка, или NaN, или неопределенное значение.
null - это то, что вы получаете, когда ищете объект, которого нет - не неопределенное свойство объекта, а сам объект.
абзац с одним textNode вернет null для узлов nextSibling, регулярное выражение, которое не соответствует, возвращает null вместо массива и так далее.
может быть, у него должен быть свой собственный тип, , но тогда он начинает быть чем-то, чем-то с типом, а не отсутствием объекта.
Это потому, что typeof
определено возвращать "объект", если входные данные null
, и возвращать "функцию", если входные данные являются вызываемыми. (См. 11.4.3 Оператор typeof
.)
Я не знаю, почему стандарт определен таким образом (и Крокфорд сказал, что это неправильно). Возможно, обратная совместимость.