Являются функциями объектов или типов в Javascript?
В своем "Ярком Javascript" Хавербеке утверждает, что (стр. 16):
"В системе JavaScript большая часть этих данных аккуратно разделяется на вещи, называемые значениями. Каждое значение имеет тип, определяющий ту роль, которую он может играть. Существует шесть основных типов значений: числа, строки, булевы, объекты, функции и undefined значения."
Но Крокфорд в Javascript: The Good Parts говорит:
"Простыми типами JavaScript являются числа, строки, логические значения (true и false), null и undefined. Все остальные значения являются объектами. Числа, строки и логические объекты являются объектноподобными, поскольку они имеют методы, но они неизменяемы. Объекты в JavaScript - это изменчивые коллекции с ключами. В JavaScript массивы - это объекты, функции - объекты, регулярные выражения - это объекты, и, конечно, объекты - это объекты."
Теперь, по крайней мере, под V8 я получаю следующее:
> typeof function(){};
'function'
> typeof {};
'object'
Я не понимаю, является ли объект типом, а функция является объектом или если функция и объект являются обоими типами. Наверное, мне не хватает различия между примитивными типами и другими типами типов (составные типы?).
Ответы
Ответ 1
Это тип объекта.
typeof
"function"
:
typeof (function() {}) === "function" // true
Внутренний [[Class]]
- [object Function]
:
({}).toString.call(function() {}) === "[object Function]" // true
Они являются экземпляром прототипа конструктора Function
:
(function(){}) instanceof Function // true
Они являются экземпляром прототипа конструктора Object
:
(function(){}) instanceof Object // true
Ответ 2
Вы должны быть осторожны, когда говорите о типах в javascript. Значения имеют Тип, который может быть одним из следующих:
- Undefined
- Null
- Boolean
- Строка
- Количество
- Объект
Верно, значение, возвращаемое оператором typeof
, не является типом, это строка, которая совпадает с типом для большинства значений, но отличается для:
- Null возвращает "объект", хотя его Тип Null
- Объект, реализующий
[[Call]]
, возвращает функцию, даже если его Тип является Объектом
- Хост-объекты могут возвращать все, что им нравится, кроме одного из ограниченных значений
Итак, нижняя строка заключается в том, что Тип функции - это Object, но typeof someFn
возвращает function
.
Ответ 3
JavaScript поддерживает функциональное программирование. В результате все функции JavaScript являются первоклассными функциями, что означает, что функции рассматриваются как обычные объекты.
http://en.wikipedia.org/wiki/First-class_functions