Типы JavaScript - PullRequest
       25

Типы JavaScript

24 голосов
/ 25 марта 2010

Согласно http://www.ecma -international.org / публикации / файлы / 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. Почему это не указано в спецификации как отдельный тип?

Спасибо

Ответы [ 7 ]

13 голосов
/ 25 марта 2010

О typeof null == 'object', это ошибка, которая приходит с первых дней, и, к сожалению, эта ошибка останется с нами надолго, было слишком поздно , чтобы быть исправлено в спецификации ECMAScript 5th Edition.

Что касается функций , они являются просто объектами, но у них есть специальное внутреннее свойство с именем [[Call]], которое используется внутри системы при вызове функции.

Оператор typeof различает простые объекты и функции, просто проверяя, обладает ли объект этим внутренним свойством.

5 голосов
/ 25 марта 2010

Это потому, что typeof определено для возврата «объекта», если вход null, и возврата «функции», если вход вызывается. (См. 11.4.3 Оператор typeof.)

Я не знаю, почему стандарт определяется так (, и Крокфорд сказал, что это неправильно ). Возможно обратная совместимость.

0 голосов
/ 10 мая 2011

Существует также Array.prototype.

  • Object.prototype
  • Array.prototype
  • Function.prototype
  • Number.prototype
  • String.prototype
  • Boolean.prototype

Крокфорд говорит не использовать:

  • новый номер ()
  • новая строка ()
  • new Boolean ()
0 голосов
/ 25 марта 2010

null - это специальное значение - это не false, это не 0, или пустая строка, или NaN, или undefined.

ноль - это то, что вы получаете, когда ищете объект, которого там нет. не неопределенное свойство объекта, а сама вещь.

абзац с одним textNode вернет ноль для узлов nextSibling, регулярное выражение, которое не соответствует, возвращает ноль вместо массива и т. д.

может быть, он должен иметь свой собственный тип, но потом это начинает быть чем-то, что-то с типом, вместо отсутствия объекта.

0 голосов
/ 25 марта 2010

Для полноты обратите внимание, что текущий лучший способ проверки информации о типе выглядит примерно так:

var typeInfo = Object.prototype.toString.call(yourObject);

Это дает вам строку, которая выглядит как "[object Something]", где "Something" является именем типа.

0 голосов
/ 25 марта 2010

typeof null === "object" потому что в спецификации так сказано, но это ошибка самой первой версии JavaScript. (как сказано выше в KennyTM).

typeof f === "function" потому что без try / catch не существует другого надежного, надежного способа определить, может ли что-либо быть вызвано. Использование f.constructor === Function может работать, но я думаю, что это не гарантировано.

0 голосов
/ 25 марта 2010

Ответ на вопрос 1:

Свойство, когда оно не имеет определения, не определено. Причина, по которой null является объектом, заключается в том, что свойство может существовать без значения, но при этом иметь определение.

...