Warum sind JavaScript-Primitive nicht instanceof Object?

8

Heute hatte ich zu viel Zeit, um zu töten und spielte ein wenig mit der Kommandozeile von Node (v0.10.13):

%Vor%

Nun, nach MDN , was instanceof tut ist:

  

Der Operator instanceof testet, ob ein Objekt in seinem Prototyp vorhanden ist   Verknüpfen Sie die Prototypeigenschaft eines Konstruktors.

Aber eindeutig Object.prototype IS in 1 's Prototyp-Kette. Also warum ist 1 instanceof Object falsch? Vielleicht weil 1 ein primitives Objekt ist, mit dem man nicht anfangen kann?

Okay, ich akzeptiere das und ich habe mehr Tests gemacht:

%Vor%

Offenbar erben also alle Primitiven von einem Objekt, und alle Strings übernehmen ein anderes Objekt. Diese beiden Objekte erben von Object.prototype .

Nun stellt sich die Frage, warum, wenn Zahlen und Strings als Primitive betrachtet werden, warum sie von anderen Objekten erben sollen? Oder umgekehrt, wie sie von anderen Objekten erben, warum betrachten Sie sie nicht auch als Objekte? Es erscheint mir sinnlos, dass das Kind eines Objekts kein Objekt ist.

Übrigens habe ich diese auch in Firefox 22 getestet und habe das gleiche Ergebnis bekommen.

    
Gary Chang 30.07.2013, 05:05
quelle

1 Antwort

25

Sie wurden von einem Mechanismus ausgetrickst, der allgemein als "Boxen" bekannt ist () c # verwandten Artikel , Java-Artikel ), der alle hypnotisiert, die aufkommen es. Du hattest am Anfang die richtige Antwort:

  

Vielleicht, weil 1 ein Primitiv ist und nicht ein Objekt, mit dem man anfangen soll?

Genau so. Wie aber können Primitive jemals Methoden enthalten können? Wie können sie Eigenschaften enthalten? Schließlich sind sie in js auf der niedrigsten möglichen Ebene dargestellt (siehe # 4.3.2 ). Um diese Werte wirklich nützlich zu machen, geschieht Folgendes immer dann, wenn Sie primitive.property ausführen: ( # 11.2.1 ):

%Vor%

Mit anderen Worten, js hat automatisches Boxen. Dies kann mit einem meiner Lieblingstricks bewiesen werden:

%Vor%

primitive.isPizza ist wegen dieses Boxens verschwunden:

%Vor%

Das eingerahmte primitive ist seine eigene einzigartige Schneeflocke - wenn Sie es ein zweites Mal einpacken, bezieht es sich nicht auf die gleiche Sache. Die Boxed-Werte sind schnell GCd und im Nebel der Zeit vergessen.

Das passiert nicht, wenn dein Primitiv nicht, na ja, ein Primitiv ist:

%Vor%

Heißt das, du solltest nur Objekte benutzen, niemals Primitive? Nein, aus dem einfachen Grund, dass die Zeiten, in denen Sie Metadaten auf Primitiven speichern müssen, sehr weit und wenig sind und Objekte Dinge komplizieren:

%Vor%     
Zirak 30.07.2013, 05:32
quelle

Tags und Links