Bas*_*sit 39 javascript variables reference object pass-by-reference
我有一个对象,它在函数内的许多不同函数中传递.这些函数可能会也可能不会更改对象的值,但如果它们确实更改了它,那么我想获取对象的最新更改.
以下是我试图做的事情:
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'};
}
Run Code Online (Sandbox Code Playgroud)
Ada*_*kis 121
在JavaScript中,对象始终通过复制引用传递.我不确定这是否是完全正确的术语,但是会传入对象的引用副本.
这意味着在完成函数执行后,您可以看到对该对象所做的任何更改.
码:
var obj = {
a: "hello"
};
function modify(o) {
o.a += " world";
}
modify(obj);
console.log(obj.a); //prints "hello world"Run Code Online (Sandbox Code Playgroud)
话虽如此,因为它只是传入的引用的副本,如果您在函数内部重新分配对象,这将在函数外部不可见,因为它只是您更改的引用的副本.
码:
var obj = {
a: "hello"
};
function modify(o) {
o = {
a: "hello world"
};
}
modify(obj);
console.log(obj.a); //prints just "hello"Run Code Online (Sandbox Code Playgroud)
“对象”不是 JavaScript 中的值,不能“传递”。
您正在处理的所有值都是引用(指向对象的指针)。
传递或分配一个引用会给出另一个指向同一对象的引用。当然,您可以通过其他引用修改同一个对象。
这是对按值传递和按引用传递(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
Run Code Online (Sandbox Code Playgroud)
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" }
Run Code Online (Sandbox Code Playgroud)
c,它指向一些内存,比如 (0x012)d=c,在这一步中 d 指向同一个位置(0x012)。特殊情况,通过引用传递(对象)
c = {"name" : "jane"};
console.log(c); // { "name" : "jane" }
console.log(d); // { "name" : "doe" }
Run Code Online (Sandbox Code Playgroud)
=) 运算符设置新的内存空间或地址| 归档时间: |
|
| 查看次数: |
58565 次 |
| 最近记录: |