2015-03-26 25 views
11

Ich verstehe nicht, warum die Ausgabe 456 ist. Ich denke, das b in a [b] ist eine Eigenschaft eines Objekts, und c ist eine weitere Eigenschaft von a. Sie sind überhaupt nicht mit den Var b und c verwandt. Aber warum a.c überschreiben a.b?Warum a [c] a [b] überschreiben?

var a={}, 
    b={key:'b'}, 
    c={key:'c'}; 

a[b]=123; 
a[c]=456; 

console.log(a[b] === 456); //true 
+4

Hier sind 'b' und' c' Eigenschaften von 'a', also sind sie Strings. Und was ist die String-Repräsentation eines Objekts? "[object Object]" – blex

+0

Dies ist ein Duplikat von vielen zuvor gestellten Fragen – meagar

Antwort

22

Das ist, weil Eigenschaftsnamen-Strings sind, aber Ihre b und c sind Objekte. Daher werden sie folgendermaßen beschriftet:

b + ''; // "[object Object]" 
c + ''; // "[object Object]" 
b + '' === c + ''; // true 

Da sie die gleiche Zeichenfolge werden, wird der Anfangswert überschrieben.

Stattdessen können Sie ECMAScript mit berücksichtigen 6 Maps, die Ihnen erlauben, einen beliebigen Wert als Schlüssel zu verwenden:

var a = new Map(), 
    b = {key: 'b'}, 
    c = {key: 'c'}; 
a.set(b, 123); 
a.set(c, 456); 
a.get(b); // 123 
5

Ihre Schlüssel werden in Zeichenketten umgewandelt. Die Zeichenfolgendarstellung ist "[object Object]". dies alles, was Sie in beiden Fällen zu tun ist:

a["[object Object]"] = 123; 
a["[object Object]"] = 456; 

Beweis:

var a={}, 
 
    b={key:'b'}, 
 
    c={key:'c'}; 
 

 
a[b]=123; 
 
a[c]=456; 
 

 
console.log(Object.keys(a));

+0

Nur aus Neugier, wenn es Ihnen nichts ausmacht: Dies scheint "zu funktionieren", wenn Sie stattdessen a.b = 123, a.c = 456 verwenden. Liegt das nur daran, dass die Verwendung von [] zum Abrufen einer Eigenschaft sie in eine Zeichenfolge konvertiert, oder bin ich verwirrt? – Mackan

+1

@Mackan Nein, denn dann verwenden Sie buchstäblich 'b' und' c' als Eigenschaftsnamen. Sie verwenden 'a.b', das ist das gleiche wie' a ['b'] ', was dasselbe wie' {a: {b: 123}} 'ist. Wenn Sie 'a.b' schreiben, wird der Eigenschaftsname' b' * nicht * als Variable ausgewertet. Es hat nichts mit Ihrer 'b'-Variable zu tun. Wenn Sie 'a.name' geschrieben haben, ist es egal, ob es eine' name' Variable im Bereich gibt, Sie arbeiten immer noch mit der Eigenschaft "name" auf dem Objekt "a". – meagar

+0

Richtig, also versucht 'a [b]' 'b' in gewissem Sinne zu bewerten, aber da es ein Objekt ist, kann es nicht und stattdessen ist es geizig. Also wäre 'a [b.key]' tatsächlich 'a ['b'] == a.b' Ich gehe davon aus. Habe mich ein bisschen in den Unterschied zwischen der Verwendung von Punkten und [] verstrickt. (Bearbeiten: Ich sehe, dass Sie bearbeitet haben, während ich meine Antwort geschrieben habe. Danke, hab es verstanden!) – Mackan

0

Orial ist recht. JS am meisten problematisch ist der Datentyp der Variable ist nicht klar bei der Deklaration, obwohl manchmal bequem.

In diesem Fall, auch wenn Sie versuchen, ein [a] == 456, zeigt es wahr.

a wird zuerst als eindimensionales Array initialisiert, wenn Sie versuchen, es als Map oder Schlüsselwert zu verwenden, können Sie einen Fehler wie diesen erwarten.

Verwandte Themen