2012-01-09 13 views
5

基本的な例:Javascriptの割り当て操作は、参照をコピーすることですか?

var b = 10; 
var c = b; 
b++; 
console.log(b,c); 

>> 11 10 

cbのコピーのように見えます。

しかし、別の場合:

var x = {}; 
var y = x; 
x.abc = 10; 
console.log(x.abc, y.abc); 

>> 10 10 

なぜxyコピーではなく、それに同じインスタンスにxポイントを指す参照がありますか?

は別のインスタンスを作成していると推測しています。したがって、bは新しいインスタンスを指しますが、cは古いインスタンスを指しています。 u++は、新しいインスタンスを作成した場合は...しかし、その後、匿名関数の内部uはいけない、古いu

var u = 10; 
setTimeout(function() { 
    console.log(u); 
}, 10000) 
u++; 

>> 11 

指している必要がありますか?

答えて

9

cbのように見えます。

両方とも同じ不変値への参照です。

なぜyxのコピーが、インスタンスを指す参照x点ではありませんか?

xは、最初の場所でオブジェクトへの参照であったので、yはそれのコピー(参照のコピーではなく、オブジェクトのコピー)です。

u++は、新しいインスタンスを作成する場合は、

それはしていません。

匿名機能のuは、古いuを指す必要がありますか?

u++は、uへの参照を割り当てます。無名関数はuであり、 "関数が作成された時点の値はu"ではありません。

+0

あなたの最後の文章 –

+1

@Quentin:オリジナルの "オブジェクト"は、js実装(ES3/5)によって作成された 'アクティベーションオブジェクト'または 'レキシカル環境'内のどこかに存在するだけなので、実際にはEに触れることはありませんCMAscript自体。 – jAndy

+0

"どちらも同じ不変の値への参照です。"それは観測された出力 "11 10"と矛盾していませんか?出力は、それらが異なる値への参照であることを示唆します。 – Neptilo

8

プリミティブが割り当てられると、に値が割り当てられます。 (あなたのオブジェクトのような)参照型は、参照によってによってに割り当てられます(または、Jon Skeetが私を訂正するので、参照のコピーが割り当てられます)。

2番目の例では、xとyは両方ともを指し、は同じオブジェクトをメモリに格納します。また、一つにabcプロパティを追加すると、あなたはまた、関数に

function addABC(foo) { 
    foo.abc = 10; 
} 

var x = {}; 
var y = x; 
addABC(x); 
console.log(x.abc, y.abc); 

をxまたはyを渡して同じ行動を観察したい他の

に追加されますが、ただ、しかし、そのxとyの点に注意してください理由ですメモリ内の同じオブジェクトを、彼らは参照の別のコピーをしているので、この

var x = { a: 1 }; 
    var y = x; 
    y = {}; 
    alert(x.a); 

この

var x = { a: 1 }; 
    var y = x; 
    x = {}; 
    alert(y.a); 
yの初期値としてx

var y = x; 

コピー値:

はまだ1

+1

"参照渡し"または "参照渡し"とは多少異なるため、ここで "参照先"という用語は嫌いです。例えば、 'addABC'メソッドを' foo 'に変更したとします= "hello" 'それは' x'の値を変更しませんでしたか?(確かに、JavaScriptはJavaとCと同じように動作すると仮定していますが、合理的な前提です) –

+0

@Jon - あなたが正しいです編集する –

4

この文を警告します。ただし、オブジェクト自体ではなく、オブジェクトにはの参照が含まれています。これはではなくであることに注意してください。割り当てが "xへの参照"をコピーしていると同じです。実際にはの値がで、xです。つまり、xの値を変更して別のオブジェクトを参照するとします。

x = "something else"; 

そのはyの値を変更しないであろう - その値は依然として元のオブジェクトへの参照となります。

+1

Jon Skeet?!?!JavaScriptタグで!!?!ようこそ、よろしく! –

+3

@AdamRackis:彼は前にこの池に足を浸しています –

関連する問題