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

Являются функциями объектов или типов в Javascript?

В своем "Ярком Javascript" Хавербеке утверждает, что (стр. 16):

"В системе JavaScript большая часть этих данных аккуратно разделяется на вещи, называемые значениями. Каждое значение имеет тип, определяющий ту роль, которую он может играть. Существует шесть основных типов значений: числа, строки, булевы, объекты, функции и undefined значения."

Но Крокфорд в Javascript: The Good Parts говорит:

"Простыми типами JavaScript являются числа, строки, логические значения (true и false), null и undefined. Все остальные значения являются объектами. Числа, строки и логические объекты являются объектноподобными, поскольку они имеют методы, но они неизменяемы. Объекты в JavaScript - это изменчивые коллекции с ключами. В JavaScript массивы - это объекты, функции - объекты, регулярные выражения - это объекты, и, конечно, объекты - это объекты."

Теперь, по крайней мере, под V8 я получаю следующее:

> typeof function(){};
'function'
> typeof {};
'object'

Я не понимаю, является ли объект типом, а функция является объектом или если функция и объект являются обоими типами. Наверное, мне не хватает различия между примитивными типами и другими типами типов (составные типы?).

4b9b3361

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