我试图理解有人向我展示的 JavaScript 的复杂性。考虑以下简单函数:
function myFunction(p) {
p.property = 1;
}
var obj = {property: 0};
console.log(obj); // {property: 0}
myFuncton(obj);
console.log(obj); // {property: 1}
让我们重复一遍,但不是覆盖对象的一部分,而是覆盖整个对象:
function myFunction(p) {
p = {property: 1};
}
var obj = {property: 0};
console.log(obj); // {property: 0}
myFuncton(obj);
console.log(obj); // {property: 0}
为什么 obj 没有按预期在这里被替换?
Why does obj not get replaced here as expected?
因为当您调用您的函数时,您将引用的副本传递给对象obj
。这意味着您可以更改/修改传递给函数的对象的属性,但不能更改实际引用。
在代码方面:
// creates an object and a reference to this object is assigned to the obj
var obj = {property: 0};
function myFunction(p) {
p = {property: 1};
}
// Here you pass a copy of the reference.
myFunction(obj);
现在无论你做什么都在这个副本上,比如修改它的名为 property
的属性会反射(reflect)到实际对象中,因为 obj
和你传递的引用的副本 < em>指向同一个对象。这就是第一种情况发生的情况。在第二种情况下,您只是尝试为您传递的引用副本分配一个新值。所以原始引用没有任何变化。