2016-05-17 9 views
1

Hier ist meine FunktionWie werden Schlüssel in einem Objektliteral ausgewertet?

function goldAndSilver(bin) { 
    var gold = bin.gold; 
    var silver = bin.silver; 
    return { gold: gold, silver: silver }; 
} 

Warum wird die erste gold Referenz der Name und die zweite gold Referenz der Wert wenn var gold = bin.gold bereits in Ausführungskontext aufgetreten. Nach der Linie läuft würde nicht gold = number immer und die Rückkehr sollte {5: 5} statt {gold: 5} ergeben?

+0

Was @IrkenInvader sagte. Ich stelle mir vor, Sie sind einfach neugierig darauf, wie der Code funktioniert, aber wenn Sie eigentlich _wollt_ '{5: 5}', würde ich sagen, dass (in den meisten Fällen) '{gold: 5}' eine weitaus sinnvollere Objektstruktur ist . –

+0

Der Titel und die Tags scheinen nicht wirklich etwas mit Ihrer eigentlichen Frage zu tun zu haben. Ich habe deine Frage aktualisiert/vereinfacht. Fühlen Sie sich frei, umzukehren, wenn Sie es nicht mögen. –

Antwort

5

Mit dieser Notation { gold: gold, silver: silver } ist das Wort vor dem Doppelpunkt immer der Name, es bezieht sich nie auf eine Variable.

Wenn Sie eine Variable, wie der Name einer Objekteigenschaft verwenden, wie dies getan werden kann:

var gold = 5; 
var obj = {}; 
obj[gold] = gold; 

Dies führt zu Object {5: 5}

+1

Beachten Sie, dass JavaScript nur Strings als Objektschlüssel verwendet, daher wäre das resultierende Objekt des obigen Codes '{" 5 ": 5}'. – Timo

+0

Es verwendet nur Zeichenfolgen, aber seine Syntax erlaubt nicht-quoted Bezeichner, und "5" ist ein gültiger Bezeichner, wie 'gold' und' splitter'. –

+1

Auch in Browsern, die dies unterstützen, können Sie Computernamen verwenden: [ecma spec] (http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer), [MDN-Referenz] (https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#New_notations_in_ECMAScript_2015), '{[gold]: gold}' –

1

Nein, weil Objekte Tasten standardmäßig nicht berechnet werden . Die Eigenschaft erhält den genauen Namen, wie Sie ihn benannt haben. Mit ES2015 können Sie jedoch computed property names verwenden, mit denen Sie eine Eigenschaft mithilfe eines dynamischen Werts benennen können.

(Beachten Sie, dass dies nur auf Browsern, die die neue Syntax unterstützen):

var gold = 5; 
 
var obj = { 
 
    [gold]: gold 
 
}; 
 

 
document.write('<pre>' + JSON.stringify(obj, null, 2) + '</pre>');

0

Dies ist das Objekt Notation. Hier ist das erste Wort vor ':' der Schlüssel. Es ist immer eine Zeichenfolge. Es ist, als würde man dem Wert, den man zuweisen möchte, einen Namen geben. Der zweite ist der Wert. In dieser Schreibweise können Sie keine Variable als Schlüssel zuweisen. Key wird immer konstant sein und eine Zeichenfolge.

{ gold: gold, silver: silver } 
is same as 
var obj = { 'gold': gold, 'silver': silver } 

Um eine Variable als Schlüssel zuzuweisen, müssen Sie die eckige Klammernnotation verwenden.

var key1='gold'; 
var key2='silver'; 
var obj={}; 
// assuming gold and silver to defined 
obj[key1]=gold; 
obj[key2]=silver; 

In beiden Fällen sind obj gleich. Das zweite Format kann jedoch verwendet werden, wenn Schlüsselnamen vor dem Zuweisen von Werten bekannt sind.

Zum Beispiel kann Code sieht ein Objekt (eine Ebene) zu klonen:

function clone(original){ 
    var clone={}; 
    for(var key in original){ 
    // Dont know what is the value of key. So we need to use square 
    //bracket. clone.key would be incorrect to use because it would be 
    //considered string. 

    clone[key]=original[key]; 
    } 
return clone; 
}