2016-05-17 14 views
1

は、ここに私の機能オブジェクトリテラルのキーはどのように評価されますか?

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

ですなぜ最初gold参照と第二gold参照var gold = bin.goldがすでに実行コンテキストに遭遇した。行が実行された後には常にgold = numberが返されず、{gold: 5}の代わりに{5: 5}が返されますか?

+0

は何@IrkenInvader言った:たとえば

は、オブジェクト(1レベル)をクローン化するためのコードを見ることができます。私はコードがどのように機能しているのか不思議ではないかと想像していますが、実際に{5:5}を望むなら({ほとんどの場合} {{gold:5}}ははるかに意味のあるオブジェクト構造です。 –

+0

タイトルとタグはあなたの実際の質問とは関係がありません。あなたの質問を更新/簡略化しました。あなたが気に入らなければ、元気に元気に戻してください。 –

答えて

5

この表記を使用して、{ gold: gold, silver: silver }コロンの前の単語は常に名前になります。変数を決して参照しません。

あなたはこのように行うことができますオブジェクトのプロパティの名前として変数を使用する場合:

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

オブジェクトのキーは、デフォルトで計算されていないので、これは Object {5: 5}

+1

JavaScriptは文字列をオブジェクトキーとしてのみ使用するので、上記のコードの結果オブジェクトは '{" 5 ":5}'になります。 – Timo

+0

これは文字列のみを使用しますが、その構文は引用符で囲まれていない識別子を許可し、 '5'は' gold'と 'sliver'と同様に有効なプロパティ識別子です。 –

+1

これをサポートするブラウザでも、Computed Names:[ecma spec](http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer)、[MDNリファレンス](https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#New_notations_in_ECMAScript_2015)、{{[gold]:gold} ' –

1

はありません、その結果。プロパティには、名前を付けたときの名前と同じ名前が付けられます。ただし、ES2015ではcomputed property namesを使用して、動的値を使用してプロパティに名前を付けることができます。

(これが唯一の新しい構文をサポートするブラウザ上で動作することに注意してください):

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

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

0

これは、オブジェクトの表記法です。 ':'の前の最初の単語がキーです。それは常に文字列です。これは、割り当てたい値に名前を割り当てるのと同じです。 2番目の値は値です。 この表記法では、変数をキーとして割り当てることはできません。キーは常に定数と文字列になります。

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

変数をキーとして割り当てるには、角カッコ表記を使用する必要があります。

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

どちらの場合も、objは同じです。ただし、値を割り当てる前にキー名がわかっている場合は、2番目の形式を使用できます。

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; 
} 
関連する問題