当一个对象被推入一个数组时,它是否引用该对象的同一个实例?
例如:
function object() {
var count = 1;
}
array = [];
var obj = new object();
array.push(obj);
这里是数组中的对象,"数组[0]",数组外对象的相同实例," obj"?
另外,如果我要将obj传递给另一个函数,我是否会将该对象的相同实例传递给函数的参数,或者该函数是否会创建一个新对象?
答案 0 :(得分:3)
将对象推入数组时,仍然只有一个对象实例。变量包含对象的引用,数组包含对同一对象的另一个引用。
如果更改了对象,那么当您通过变量和数组查看时,更改都是可见的,因为它是同一个对象。但是,如果更改变量(例如为其分配另一个对象),则不会影响该数组;它仍将引用原始对象。
将对象作为参数传递给函数时,引用按值传递。仍然只有一个对象实例,但该参数与您在调用中使用的变量是分开的。如果更改函数内部的对象,则更改在函数外部可见,因为它是同一个对象,但如果更改的参数不会影响您在调用中使用的变量。
答案 1 :(得分:1)
javascript中的对象通过引用传递给数组。要试用一些代码,
function object(){
var count = 1;
}
array = [];
var obj = new object();
array.push(obj);
array.push(obj);
array[1]['n'] = 5
生成
array
=> [ { n: 5 }, { n: 5 } ]
这是因为您只是处理对实际对象的引用。因此,对该对象的任何引用都是相同的 - 无论是在数组内部,重复项还是您拥有的内容。如果你想要深层复制,你需要自己实现。
答案 2 :(得分:0)
Javascript是通过原语的值传递的(对于对象也是如此 - 但在这种情况下,值是对象的引用)。但是,将对象传递给数组时,此值是对对象的引用。当您传递一个对象或数组时,您正在传递对该对象的引用,并且可以修改该对象的内容,但是如果您尝试覆盖该引用,它将不会影响该调用者所持有的引用的副本即引用本身是按值传递的。
传入基元(例如字符串/数字)时,值会按值传入。函数中对该变量的任何更改都与函数外部发生的任何更改分开。
传递基元的值
function testFunction(x) {
// x is 4
x = 5;
// x is now 5
}
var x = 4;
alert(x); // x is equal to 4
testFunction(x);
alert(x); // x is still equal to 4
通过引用传递对象(按值传递,但此值是引用):
function myObject() {
this.value = 5;
}
var o = new myObject();
alert(o.value); // o.value = 5
function objectchanger(fnc) {
fnc.value = 6;
}
objectchanger(o);
alert(o.value); // o.value is now equal to 6
传入一个对象的方法虽然不是通过引用传递的(由于在将一个函数作为参数传递时丢失了上下文)。
答案 3 :(得分:-1)
所有不是primitive type的内容都是通过引用传递的。