Подтвердить что ты не робот

Типы 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. Почему это не указано в спецификации как отдельный тип?

Спасибо,

4b9b3361

Ответ 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()