2

どんどん観察していることをよく理解したいです。

状況によっては、同じモデルの異なるインスタンスが同じ方法で属性を変更します(2つのUserModel AとBがある場合、Aを変更すると、Bも同じように影響を受けます)。

私はいくつかの実際的なケースを観察しました:

モデルのインスタンスをビューコンストラクターに送信すると、それらはリンクされます。ビュー内のモデルを変更すると、外部のモデルも同じように影響を受けます。インスタンスのコピーではなく、ポインタをビューに送信するだけの場合もあると思います。

いくつかのコードでより具体的に;

A = new UserModel();
B = new UserModel();

var Data = A.get('info'); //where info = {some: "thing"};
Data.some = 'other';
B.set('info', Data); //A.get('info') == B.get('info')

属性だけでなくオブジェクトinfoも個別に取得したためです(テストしたところ、この方法で値の間に影響はありません)。

だから私の質問は、私たちは常にjavascriptのオブジェクトでポインタを使用していますか?それはバックボーンに固有ですか?この動作の背後にあるものを理解したいと思います。

ありがとう。

4

1 に答える 1

3

オブジェクトと配列は、コピーではなく、javascript の参照として渡されるか割り当てられます。オブジェクトまたは配列のコピーが必要な場合は、明示的にコピーを作成する必要があります。

数値やブール値などの単純な型は、割り当てまたは渡されるときにコピーされます。

文字列は少し特殊なケースです。これらは参照として渡されますが、文字列は不変 (変更できない) であるため、文字列を変更しようとすると新しい文字列が作成されるため、文字列参照を実際に使用することはできません。

いくつかの例:

// arrays assigned by reference
var a = [1,2,3];
var b = a;
a[0] = 0;
alert(b[0]);  // alerts 0 because b and a are the same array

// objects assigned by reference
var c = {greeting: "hello"};
var d = c;
c.greeting = "bye";
alert(d.greeting);   // alerts "bye" because c and d are the same object

// numbers assigned as copies
var e = 3.414;
var f = e;
e = 999;
alert(f);    // alerts 3.414 because f is its own copy of the original number

// make a copy of an array
var g = [1,2,3];
var h = g.slice(0);    // h is now a copy
h[0] = 9;
alert(g);              // shows [1,2,3]
alert(h);              // shows [9,2,3]

関数に引数を渡したり、関数から値を返したりする場合も同様です。明示的なコピーが作成されない限り、配列とオブジェクトは参照によって渡されるか返されます。


メソッドを使用して、配列の浅いコピーを作成できます.slice()

var arr1 = [1,2,3];
var arr2 = arr1.slice(0);   // make independent copy of first array

オブジェクトの浅いコピーは、各プロパティを元のオブジェクトから新しいオブジェクトにコピーすることで作成できます。

ディープ コピーには、コピーされる各項目の型のテストと、それがオブジェクトまたは配列である場合はオブジェクトの再帰が含まれるため、ネストされたオブジェクトと配列もコピーされます。

于 2013-01-28T07:56:13.727 に答える