This question already has answers here:
Is JavaScript a pass-by-reference or pass-by-value language?

(32个答案)



Why this code references different result

(4个答案)


在10个月前关闭。




谁能解释我下面这段代码中发生了什么?为什么会这样工作?我期望变量a也会改变...
var base = {
  cars: {
    color: "blue",
    brand: "Ford"
  }
}

var a = base.cars;
base.cars = function () { console.log("example method") }

console.log(base) // changed to method
console.log(a) // still is object - why?

最佳答案

因为JavaScript中没有指针。

刚开始时,您会遇到以下情况:

base ---+
        |
        v
        {
          cars ----+
        }          |
                   v
                   {
                     color: "blue"
                     brand: "Ford"
                   }
                   ^
                   |
a -----------------+

现在base.carsa都指向同一个对象。

然后,当您重新分配base.cars时,它将变为:

base ---+
        |
        v
        {
          cars ---> function(){ ... }
        }

                   {
                     color: "blue"
                     brand: "Ford"
                   }
                   ^
                   |
a -----------------+

分配时a将继续指向base.cars引用的对象。这样,即使重新分配了base.cars,它也不会影响a的值(和引用)。

如果您能够创建一个指针,它将如下所示:

base ---+
        |
        v
        {
          cars ----+
        } ^        |
          |        v
          |        {
          |          color: "blue"
          |          brand: "Ford"
          |        }
          |
          |
a --------+

...并且在重新分配后:

base ---+
        |
        v
        {
          cars ----> function(){ ... }
        } ^
          |
          |        {
          |          color: "blue"
          |          brand: "Ford"
          |        }
          |        |
          |        +--> Garbage collection
a --------+

07-24 09:38
查看更多