gpt4 book ai didi

javascript - 对象之间的指针行为

转载 作者:行者123 更新时间:2023-11-29 20:01:09 24 4
gpt4 key购买 nike

我想更好地理解我观察到的越来越多的东西。

在某些情况下,同一模型的不同实例会以相同的方式更改其属性(如果我有 2 个 UserModel A 和 B,如果我更改 A,B 将以相同的方式受到影响)。

我观察了一些实际案例:

当我将模型实例发送到 View 构造函数时,它们是链接的,如果我更改 View 中的模型,外部模型将以同样的方式受到影响。我想有时我们只是将一个指针而不是实例的副本发送到 View 。

更具体一些代码;

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 中对对象使用指针?它特定于 backbone 吗?我想了解这种行为背后的原因。

谢谢。

最佳答案

对象和数组在 javascript 中作为引用传递或分配,而不是副本。如果你想要一个对象或数组的副本,你必须明确地制作一个副本。

较简单的类型,例如数字、 bool 值,在分配或传递时会被复制。

字符串有点特殊。它们作为引用传递,但由于字符串是不可变的(无法更改),因此您不能真正对任何内容使用字符串引用,因为任何修改字符串的尝试都会创建一个新字符串。

几个例子:

// 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

可以通过将每个属性从原始对象复制到新对象来创建对象的浅拷贝。

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

关于javascript - 对象之间的指针行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14557654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com