推送数组中的对象的JavaScript是什么 - 通过引用或值?

Om *_*kar 3 javascript coding-style

当我创建一个对象并将其推送到一个数组时,它是通过引用或值存储的吗?

我看到以下情况发生了:

var abc = { a: 10, b: 20};
var def = [];
def.push(abc);

abc.a = 100;

def[0].a; // outputs 100!

// if I do this
abc = { a: 10000, b: 20000 };

def[0].a; // still 100, no change this time
Run Code Online (Sandbox Code Playgroud)

控制台中的图像:

控制台中的图像

如果我使用=符号来指定一个对象abc,abc那么数组中指向的引用def也应该改变,不是吗?我们在上面,通过价值或参考来称呼什么?

我理解它就像是abc指向一个值的引用.只要我们不使用=标志,它就会一直指向它.请指导.

Nie*_*sol 7

对象总是通过引用传递.

在你写的时候abc = { a: 10000, b: 20000 },你要覆盖的是变量 abc,它指向旧对象,但现在指向新对象.


Sir*_*rko 7

我们来看看发生了什么:

var abc = { a: 10, b: 20};
Run Code Online (Sandbox Code Playgroud)

在内存中创建一个新对象并将其分配给变量abc.

var def = [];
Run Code Online (Sandbox Code Playgroud)

在内存中创建一个新数组并将其分配给变量def.

def.push(abc);
Run Code Online (Sandbox Code Playgroud)

在数组内部,现在有一个指向以前创建的对象的指针.

 abc.a = 100;

 def[0].a; // outputs 100!
Run Code Online (Sandbox Code Playgroud)

显然是对的.我们正在修改对象,该对象也由数组引用.

 abc = { a: 10000, b: 20000 };
Run Code Online (Sandbox Code Playgroud)

再次创建一个新对象,并存储对它的引用abc.现在我们在内存中有两个对象(和一个数组).

 def[0].a; // still 100, no change this time
Run Code Online (Sandbox Code Playgroud)

当然,这仍然是100.数组指针仍然引用第一个创建的对象而不是第二个.