3

私はこれが機能することを知っていますが、なぜそれがこのように機能するように作られたのか、その背後にある理由はわかりません:

var foo = [5, 10];
var bar = foo;
console.log(foo); //[5, 10]
console.log(bar); //[5, 10]
bar[0] = 1; 
console.log(foo); //[1, 10]
bar = null;
console.log(foo); //[1, 10]

bar私はヌルになるだけでなくfoo、同様になることを期待していました。これを理解するのに助けが欲しいです。

4

6 に答える 6

3

これを行うと、変数bar = null;の値に何かが割り当てられます。barに割り当てられていたものには影響しませんbar。そのオブジェクトは存続し続け、他の参照がある場合は、その値に影響を与えずに存続します。

これを行うとき:

var foo = [5, 10];
var bar = foo;

3つのエンティティがあります。配列[5,10]と、それぞれがその配列への参照を持つ2つの変数があります。配列を変更すると、両方の変数が同じ配列を指しているため、配列を参照する変数に関係なく、その変更が表示されます。

ただし、を設定すると、変数bar = nullに影響するだけでbar、配列への参照がなくなります。がまだ指している配列にはまったく影響しませんfoo

実際、これを行った場合:

var foo = [5, 10];
var bar = foo;
bar = [20,30];

同じような結果になります。コードの2行目以降は、同じ配列barを指していますが、3行目以降は、新しい配列を指しており、元の配列のみを指しています。重要なのは、ポイントするオブジェクトを変更するために使用するのと、バーの値全体をのように再割り当てするのとでは違いがあることを理解することです。最初のケースでは、との両方が指す基になるオブジェクトが変更されます。2番目のケースでは、最初に指していた基になるオブジェクトはタッチされません。代わりに、新しいオブジェクトを指すように変更され、前のオブジェクトは変更されません。foobarfoobarbar[0] = 1bar = [20,30]foobarbarbar

于 2012-08-07T00:03:18.043 に答える
2

違いは、再バインド操作と変更操作の違いです。

bar[0] = 1

変異しています。barを指すオブジェクトに影響します。

bar = null

再バインドしています。識別子のbar意味に影響するだけです。

于 2012-08-07T00:06:34.910 に答える
0

配列へのポインタが2つあります。Bar=fooは元のポインターをコピーします。バーの間接参照はfooを間接参照しません。

続きを読む@http ://snook.ca/archives/javascript/javascript_pass

于 2012-08-07T00:08:04.767 に答える
0

あなたがするとき

var foo = [5, 10];

このように、配列への参照を作成します

foo --->  [5, 10]

に割り当てるbarfoo

foo --->  [5, 10]

bar ------^

電話するとき

bar[0] = 1;

あなたが得る

foo --->  [1, 10]

bar ------^

ここで、同じオブジェクトを指しますfoobar

電話するとき

bar = null;

あなたは今持っています

foo --->  [1, 10]
于 2012-08-07T00:08:50.957 に答える
0

参照ですが、その定義はオブジェクトへの単なるポインタです。バーに割り当てるときはnull、に保存されていたこの「ポインタ」を削除するだけでbar、オブジェクトを指すことはなくなります。

これを紙に書かれた住所として想像してみてください。シートfoobar同じ住所があり、コマンドを発行した場合:シートに書かれた住所に行き、fooそこに何かを置いてください。操作が完了した後、当然、それらのシートのいずれかを見てその住所をチェックすると、それらが見つかります。変更します。これで、の割り当てはnull、消しゴムでシートからこのアドレスを消去するのと同じです。他のシートにも、家にも触れません。

于 2012-08-07T00:09:19.077 に答える
0

私は変数をラベルと考えるのが好きです。説明が簡単になります。

//Create an array containing 5 and 10, and put the label "foo" on it
var foo = [5, 10];
//Put the label "bar" on the thing with the label "foo"
var bar = foo;      
console.log(foo); //[5, 10]
console.log(bar); //[5, 10]
//Take the thing labeled "bar" (which also has the label "foo") and change the first element to 1
bar[0] = 1;         
console.log(foo); //[1, 10]
//Take the label "bar" and attach it to nothing
bar = null;
console.log(foo); //[1, 10]

var foo = [5、10]; var bar = foo; console.log(foo); // [5、10] console.log(bar); // [5、10] bar [0] = 1; console.log(foo); // [1、10] bar = null; console.log(foo); // [1、10]

于 2012-08-07T00:13:12.277 に答える