2013-02-12 14 views
23

Pracuję z node.js, więc może to być specyficzne dla V8.Różnice między typeof i instanceof w JavaScript

Zawsze zauważyłem pewną weirdness z różnic między typeof i instanceof, ale tutaj jest jeden, który naprawdę robaki mnie:

var foo = 'foo'; 
console.log(typeof foo); 

Output: "string" 

console.log(foo instanceof String); 

Output: false 

Co się tam dzieje?

+3

W JavaScript, wierzę istnieje dychotomia między pierwotny typ łańcucha i typ obiektu "String". Przez większość czasu są wymienne, najwyraźniej nie w celu sprawdzenia "instanceof". – millimoose

+3

Spójrz na to: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String#Distinction_between_string_primitives_and_String_objects – Waxen

+0

Ba, powinien Szukano więc najpierw: http: // stackoverflow .pl/questions/11571923/instanceof-string-not-behave-as-expected-in-google-apps-script/11572009 # 11572009 – Eric

Odpowiedz

38

typeof to konstrukt, który "zwraca" pierwotny typ tego, co go przekazuje.
instanceof testuje, czy prawy argument pojawia się w dowolnym miejscu łańcucha prototypów po lewej stronie.

Należy zauważyć, że istnieje ogromna różnica między literałem literowym "abc", a ciągiem znaków new String("abc"). W tym ostatnim przypadku, typeof zwróci "obiekt" zamiast "ciąg".

7

Istnieją literalne ciągi znaków i istnieje klasa String. Są one oddzielne, ale działają bezproblemowo, tzn. Można nadal stosować metody String do literalnego ciągu znaków i będzie on działał tak, jakby literalny ciąg był instancją obiektu String.

Jeśli jawnie utworzyć instancję String, to obiekt, i jest to instancja klasy String:

var s = new String("asdf"); 
console.log(typeof s); 
console.log(s instanceof String); 

wyjściowa:

object 
true 
+1

Należy zauważyć, że wyjście 'typeof' będzie w rzeczywistości' 'object" '(ciągiem z małą literą) – rgthree

+0

@rgthree: Tak, masz rację. Poprawiłem wynik. – Guffa

+0

@rgthree należy to również dodać, aby odpowiedzieć – kittu

Powiązane problemy