Типы JavaScript
По 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:
Почему null вместо типа object
вместо null
?
Вопрос 2:
Как насчет функций?
var f = function() {};
console.log(typeof f); // <-- function
Переменная f
имеет тип function
. Почему это не указано в спецификации
как отдельный тип?
Спасибо,
Ответы
Ответ 1
О typeof null == 'object'
, это ошибка, которая приходит с ранних дней, и, к сожалению, эта ошибка останется с нами в течение длительного времени, она была слишком поздно, чтобы быть исправлена в спецификации ECMAScript 5th Edition.
О функциях, это просто объекты, но у них есть специальное внутреннее свойство [[Call]]
, которое используется внутри, когда вызывается функция.
Оператор typeof
различает простые объекты и функции, просто проверяя, имеет ли объект это внутреннее свойство.
Ответ 2
Это потому, что typeof
определяется как возвращающий "объект", если вход null
, и возвращает "функцию", если вход является вызываемым. (См. 11.4.3 Оператор typeof
.)
Я не знаю, почему стандарт определен как это (и Крокфорд сказал это неправильно). Возможно, обратная совместимость.
Ответ 3
Ответ на вопрос 1:
Свойство, если оно не имеет определения, undefined. Причина null - это объект, так что свойство может существовать без значения, но все еще имеет определение.
Ответ 4
typeof null === "object"
, потому что спецификация говорит так, но это ошибка из самой первой версии JavaScript. (как говорит KennyTM выше).
typeof f === "function"
, потому что без try
/catch
нет другого надежного, надежного способа определить, является ли что-то вызываемым. Использование f.constructor === Function
может работать, но я думаю, что это не гарантировано.
Ответ 5
Для полноты, обратите внимание, что текущий наилучший способ проверки информации о типе выглядит примерно так:
var typeInfo = Object.prototype.toString.call(yourObject);
Это дает вам строку, которая выглядит как "[object Something]", где "Something" - это имя типа.
Ответ 6
null - это специальное значение - оно не является ложным, оно не равно 0 или пустая строка или NaN или undefined.
null - это то, что вы получаете, когда ищете объект, которого нет,
а не свойство undefined объекта, но сама вещь.
абзац с одним текстовымNode возвращает null для узлов nextSibling,
regexp, который does'n соответствует, возвращает null вместо массива
и т.д.
возможно, он должен иметь свой собственный тип,
но тогда это начинает быть чем-то,
что-то с типом, вместо отсутствия объекта.
Ответ 7
Существует также Array.prototype.
- Object.prototype
- Array.prototype
- Function.prototype
- Number.prototype
- String.prototype
- Boolean.prototype
Crockford говорит, что не использовать:
- новый номер()
- new String()
- new Boolean()