JS通过引用传递给一个函数并可以覆盖属性,但是不能覆盖整个对象?

时间:2017-02-20 20:25:24

标签: javascript

我试图理解有人在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?

2 个答案:

答案 0 :(得分:2)

  

为什么不按预期更换obj?

因为当您调用函数时,您将参考的副本传递给对象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的属性被反映到实际对象一样,因为obj和它传递的副本指向同一个对象。这是第一种情况发生的情况。在第二种情况下,您只是尝试为您传递的引用的副本分配一个新值。所以原始参考没有任何反应。

答案 1 :(得分:1)

因为您要为函数中的局部变量分配新值。

第一个代码段有效,因为您正在修改您引用的对象。第二个不起作用,因为您正在抛弃您已经离开的引用并且正在为该变量分配不同的对象。