我有一个对象,它在函数内的许多不同函数中传递。这些函数可能会也可能不会更改对象的值,但如果它们确实更改了它,那么我希望获得对象的最新更改。
以下是我想要做的事情:
var ob = {text: 'this is me', name: 'john'}
function (object) {
changeObject(object);
customObjectChanger(object);
callback = function (object) {
object.text = 'new text';
}
callback(object);
// object value here should be object{text: 'new text', name: 'john'};
}
答案 0 :(得分:109)
在JavaScript中,对象始终通过copy-reference传递。我不确定这是否是完全正确的术语,但是会传递对象引用的副本。
这意味着在执行完该功能后,您可以看到对该对象所做的任何更改。
代码:
var obj = {
a: "hello"
};
function modify(o) {
o.a += " world";
}
modify(obj);
console.log(obj.a); //prints "hello world"
话虽如此,因为只有副本传入的引用,如果你重新分配你函数内部的对象,这将 在函数外部不可见,因为它只是的副本您更改的引用。
代码:
var obj = {
a: "hello"
};
function modify(o) {
o = {
a: "hello world"
};
}
modify(obj);
console.log(obj.a); //prints just "hello"
答案 1 :(得分:4)
“对象”不是JavaScript中的值,也不能“传递”。
您正在处理的所有值都是引用(指向对象的指针)。
传递或指定引用会给出另一个指向同一对象的引用。当然,您可以通过其他参考修改同一个对象。
答案 2 :(得分:1)
这是有关按值传递和按引用传递(Javascript)的更多说明。 在这个概念中,他们正在谈论通过引用传递变量和通过引用传递变量。
按值传递(原始类型)
var a = 3;
var b = a;
console.log(a); // a = 3
console.log(b); // b = 3
a=4;
console.log(a); // a = 4
console.log(b); // b = 3
a
分配了一个内存(例如0x001),并且b
在内存中创建了一个值的副本(例如0x002)。通过引用传递(对象)
var c = { "name" : "john" };
var d = c;
console.log(c); // { "name" : "john" }
console.log(d); // { "name" : "john" }
c.name = "doe";
console.log(c); // { "name" : "doe" }
console.log(d); // { "name" : "doe" }
c
,它指向某个内存,例如(0x012)d=c
时,在此步骤d中指向相同的位置(0x012)。特殊情况,通过引用传递(对象)
c = {"name" : "jane"};
console.log(c); // { "name" : "jane" }
console.log(d); // { "name" : "doe" }
=
)运算符设置新的内存空间或地址