Javascript shallow copies

Javascript shallow copies

本文关键字:copies shallow Javascript      更新时间:2023-09-26

我是Javascript新手,遇到了对象引用的问题。下面是再现这个问题的代码片段:

function MyVector() {
    this.x = 0;
    this.y = 0;
}
function MySprite() {
    this.pos = new MyVector();
}
var my_sprite = new MySprite(); 
var my_pos = my_sprite.pos;    // my_pos points to my_sprite's vector
var my_vect = new MyVector();  // my_vector is on the heap
my_vect.x = 69;
print("my_pos.x: " + my_pos.x);  // prints 0 (expected)
my_sprite.pos = my_vect;         // should point to my_vect
print("my_sprite.pos.x: " + my_sprite.pos.x); // prints 69 (expected)
print("my_pos.x: " + my_pos.x);  // prints 0, expected to print 69

在最后一个print语句中,我期望my_pos。因为my_pos现在指向my_vect(还是指向my_vect ?)我对Javascript的理解是,实际上只有原始值被复制,对象赋值维护对对象的单个副本的引用。看起来在my_vect赋值之后,my_pos引用在某种程度上被"分离"了,不再指向my_sprite.pos。

是否有一些Javascript的行为,我在这里忽略了?

谢谢!

你的代码有更多的注释,希望这对你有帮助

function MyVector() {
    this.x = 0;
    this.y = 0;
}
function MySprite() {
    this.pos = new MyVector();
}
var my_sprite = new MySprite();
在这一点上,一个新的MyVector()被创建并分配给my_sprite.pos。设它为向量#1
var my_pos = my_sprite.pos;    // my_pos points to my_sprite's vector

my_pos指向vector#1(你赋值的是指针,而不是数据)

var my_vect = new MyVector();  // my_vector is on the heap

创建一个新的MyVector,我们称它为vector#2。另外,my_vect指向向量#2

my_vect.x = 69;
print("my_pos.x: " + my_pos.x);  // prints 0 (expected)
my_sprite.pos = my_vect;         // should point to my_vect

my_sprite的pos成员现在指向向量#2

print("my_sprite.pos.x: " + my_sprite.pos.x); // prints 69 (expected)

但my_pos仍然指向向量#1,因为它从未被重新分配!

print("my_pos.x: " + my_pos.x);  // prints 0, expected to print 69

你没有忽略任何东西。

var my_sprite = new MySprite(); 

所以这里,

my_sprite.pos == new myVector(); 
var my_pos = my_sprite.pos;  // my_pos equals that new myVector.

你从来没有重新分配my_pos,所以当你打印它时它仍然等于新的myVector。在javascript中分配变量时,my_pos不指向my_sprite.pos,因为my_sprite.pos也是一个指针,所以它简单地指向my_sprite.pos指向的内容。