2016-09-01 3 views
4

Während einige Beispiele zu üben, stieß ich auf das folgende Beispiel:Legendes Objektliterale

var foo = {unique_prop: 1}; 
var bar = {unique_prop: 2}; 
var object = {}; 
object[foo] = 'value'; 
alert(object[bar]); 

wo zwei Objekte foo und bar erzeugt werden. Ich bekomme nicht, wie wachsam (Objekt [bar]); ist "Wert". Was ist der Link hier zwischen foo und bar.

Auch eine kleine Abweichung würde die Ausgabe als "undefined" geben, wie das Beispiel unten zeigt.

var foo = {unique_prop: 1}; 
var bar = {unique_prop: 2}; 
var object = {}; 
object["foo"] = 'value'; 
alert(object[bar]); 

standardmäßig die [] Notation können die Saiten rechts verwenden, Arent ["some_property"] und [some_property] gleich?

+5

Die Verbindung zwischen 'foo' und 'bar' ist, dass sie beide dasselbe Ergebnis ergeben, wenn sie in eine Zeichenfolge (die alle Eigenschaftsschlüssel sind) – Bergi

+4

„* Arent' [“some_property"]' und '[some_property] ' das gleiche? * "- Nr. – Bergi

+0

Btw, wie ein' Object' in ein Primitiv umgewandelt wird, wird durch die 'valueOf' oder' toString' Methoden reguliert (ersteres hat Vorrang vor dem letzteren, falls beide definiert sind). – ftor

Antwort

6

Bei Verwendung der eckigen Klammernotation wird alles innerhalb der eckigen Klammern in eine Zeichenfolge umgewandelt. Dann wird diese Zeichenfolge verwendet, um nach einer Eigenschaft zu suchen, die dasselbe heißt.

var foo = {unique_prop: 1}; 
var bar = {unique_prop: 2}; 
var object = {}; 

object[foo] = 'value'; 
// foo is an object, so it's automatically turned into the string "[object Object]" 
// so the above code is equivalent to `object["[object Object]"] = 'value';` 

alert(object[bar]); 
// bar is also an object, so is converted into the same string 
// the above code is also equivalent to `alert(object["[object Object]"]);` which of course accesses that same value 

var blah = "not blah"; 
object.blah = 1; 
object["blah"] = 1; 

object[blah]; 
// a variable is used. 
// therefore the value of that variable is what the assessor is looking for, not the name of the variable. 
// so the above code is equivalent to `object["not blah"];`. 
0

aN Schlüssel des Objekts kann nur Strings sein *, also, wenn Sie eine Eigenschaft des Objekts zugreifen Wert verwendet, der kein String ist, wird sie in einen String umgewandelt.

In ECMAScript 6 können Sie Map verwenden, die Objekten ähnlich ist, aber Sie können einen beliebigen Wert als Schlüssel verwenden. Beispiel:

const foo = {unique_prop: 1} 
const bar = {unique_prop: 2} 
const map = new Map() 
map.set(foo, 'value') 
console.log(map.get(bar)) // undefined 

* In ECMAScript 6 Sie können auch symbols verwenden, aber das ist hier nicht relevant.