Типы данных 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:

Почему пустой указатель типа object вместо null?

Вопрос 2:

Что относительно функций?

var f = function() {};
console.log(typeof f); // <-- function

Переменная f имеет тип function. Почему это не указано в спецификации как отдельный тип?

Спасибо,

24
задан Tatu Ulmanen 25 March 2010 в 18:26
поделиться

6 ответов

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

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

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

13
ответ дан 29 November 2019 в 00:22
поделиться

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

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

0
ответ дан 29 November 2019 в 00:22
поделиться

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

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

0
ответ дан 29 November 2019 в 00:22
поделиться

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

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

Это дает вам строку, которая выглядит как «[объект Something]», где «Something» - это имя типа.

0
ответ дан 29 November 2019 в 00:22
поделиться

null - это специальное значение - оно не является ложным, это не 0, или пустая строка, или NaN, или неопределенное значение.

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

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

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

0
ответ дан 29 November 2019 в 00:22
поделиться

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

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

5
ответ дан 29 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: