2013-03-14 10 views
18

W swoim wymowny JavaScript, Haverbeke twierdzi, że (strona 16).Czy obiekty funkcji lub typy w JavaScript?

„W systemie JavaScript, większość z tych danych jest starannie rozdzielone na rzeczy zwanych wartości Każda wartość ma typ, który określa rodzaj Rola jaką może zagrać Istnieje sześć podstawowych typów wartości: liczby, łańcuchy, wartości logiczne, obiekty, funkcje i niezdefiniowane wartości. "

Ale Crockforda w JavaScript: The Good Parts mówi.

„Proste typy JavaScript są liczby, ciągi znaków, wartości logiczne (prawda i fałsz), null, a niezdefiniowane Wszystkie inne wartości są obiektami Liczby, łańcuchy znaków i booleans są obiektowe w tym sensie, że mają metody, ale są niezmienne. Obiekty w JavaScript to zmienne, zmutowane kolekcje. W JavaScript tablice są obiektami, funkcjami są obiekty, wyrażenia regularne są obiektami, i oczywiście obiekty są obiektami. "

Teraz, przynajmniej pod V8 uzyskać to:

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

Nie rozumiem, jeśli obiekt jest rodzaj i funkcja jest obiektem lub jeśli funkcja i przedmiot są oba typy. Chyba brakuje mi rozróżnienia między typami pierwotnymi a rodzajami innego typu (typy złożone?).

+0

Wszystko w JS to obiekt. To tak, jakby powiedzieć, że kwadrat to prostokąt, ale prostokąt nie jest kwadratem. –

+1

@Derek: Niezupełnie wszystko. JS ma prymitywy * (bez obiektów) *, a niektóre z nich mają obiekt "opakowania", ale nie wszystkie. –

+0

Najprościej jest po prostu myśleć o funkcji jako szczególnym typie obiektu, podobnie jak tablica jest specjalnym typem obiektu. Mają możliwości obiektu, ale także inne możliwości, które czynią z niego inny typ obiektu. – jfriend00

Odpowiedz

22

Są typem obiektu.

typeof jest "function":

typeof (function() {}) === "function" // true 

Wewnętrzna [[Class]] jest [object Function]:

({}).toString.call(function() {}) === "[object Function]" // true 

Są instancją prototypu Function konstruktora:

(function(){}) instanceof Function // true 

Są na wystąpienie prototypu konstruktora Object:

(function(){}) instanceof Object // true 
+0

+1. Świetne, zwięzłe wyjaśnienie. –

0

JavaScript obsługuje programowanie funkcjonalne. W rezultacie wszystkie funkcje JavaScript są funkcjami pierwszorzędnymi, co oznacza, że ​​funkcje są traktowane jak zwykłe obiekty.

http://en.wikipedia.org/wiki/First-class_functions

+2

Jeśli są traktowane zupełnie jak zwykłe obiekty (np. '{}'), To dlaczego jest 'typeof {}! == typeof function() {}'? – icktoofay

+1

@ icktoofay - ponieważ ECMA-262 określa, co zwraca operator "typeof'" (http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.3), a dla niektórych obiektów nie zwraca typu (np. Null jest typem Null, ale 'typeof Null' zwraca 'obiekt'). – RobG

+1

(Tak naprawdę próbowałem przekonać ich, żeby dodali to w odpowiedzi - to nie było coś, o co się zastanawiałem.) – icktoofay

5

Trzeba być ostrożnym, gdy mówimy o typach w JavaScript.Wartości mają Type, co może być jedną z następujących czynności:

  1. Undefined
  2. Null
  3. Boolean
  4. String
  5. Ilość
  6. Object

przewrotnie, wartość zwracany przez typeof operator nie jest typem, to jest ing, że jest taki sam, jak dla większości wartości, ale jest inna dla:

  1. Null zwraca „przedmiot”, choć jego typ jest Null
  2. Obiekt, który implementuje funkcję [[Call]] powraca, choć jego typ Obiekt jest
  3. obiektów gospodarz może powrócić niczego lubią inny niż jeden z ograniczonych wartościach

Więc dolnej linii jest, że typ funkcji jest obiekt, ale typeof someFn powraca function.

Powiązane problemy