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 回答