2016-07-14 22 views
1

Javascriptオブジェクトの構造を変更しようとしていましたが、ログから受け取った結果がわかりません。私のようなものを期待していますがJavaScriptの割り当ての問題

console.log(a) // {e: 1, f: 2} 
console.log(a.b) // {e: 1, f: 2} 

:私はa.b = aを行う場合、私はこれらの結果を受け取るa = {e: 1, f: 2}

そして私はa.b

にそれを移動したい:

私は、以下の目的を持っていますこれは:

console.log(a) // {b: {e: 1, f: 2}} 
console.log(a.b) // {e: 1, f: 2} 

誰かがなぜこれが起こっているのか説明できますか?

答えて

2

a.b = aは単に、再帰的オブジェクトになるためにaを引き起こしaへの参照、としてa.bを割り当てます。

var a = {e: 1, f: 2}; 
 
a.b = a; 
 

 
console.log(a.e, a.f); //1 2 
 
console.log(a.b.e, a.b.f); //1 2 
 
console.log(a.b.b.e, a.b.b.f); //1 2 
 
console.log(a.b.b.b.e, a.b.b.b.f); //1 2

が実際にa.baのプロパティを移動するには、あなたが必要です既存のオブジェクトを上書きするには、新しいプロパティbを既存の値に割り当てます。

var a = {e: 1, f: 2}; 
 

 
a = {b: a}; 
 

 
console.log(a); //{b: {e: 1, f: 2}}

ブラウザ
+0

あなたの例では、すでに 'a'に新しいオブジェクトを割り当てているので、' JSON.parse' 'JSON.stringify'の組み合わせは必要ありません。 'a = {b:a}'はスマエ効果を持つはずです。 –

+0

ありがとう、@ t.niese、なぜ私はJSONメソッドが必要と思ったのかわかりません。 –

3

JSに値を割り当てると、には移動しません。にコピーされます。

既存のオブジェクトにbプロパティを追加しています。

console.logは、プロパティを表示しないことによって無限再帰から自分自身を保護するため、ログには表示されません。

+0

? Firefoxでは 'console.log'は私に' b'を表示します。 – Scimonster

+0

@Scimonster - OPが使用しているブラウザ。 – Quentin

関連する問題