对象之间的指针行为

时间:2013-01-28 07:52:14

标签: javascript backbone.js

我想了解一些我越来越多的观察。

在某些情况下,来自同一模型的不同实例以相同的方式更改其属性(如果我有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中使用带有对象的指针吗?它是否特定于骨干?我想了解这种行为背后的原因。

感谢。

1 个答案:

答案 0 :(得分: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

可以通过将原始对象中的每个属性复制到新对象来生成对象的浅表副本。

深层拷贝涉及测试正在复制的每个项目的类型,如果它是一个对象或数组,则会对该对象进行递归,因此也会复制嵌套对象和数组。