JavaScript对象引用未按预期工作。

5

有人能解释一下以下代码发生了什么吗?为什么会这样运行?我本以为变量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?

4
不清楚你为什么会有这种期望。你正在给该属性赋一个新值,但这并不影响指向旧值的其他引用。 - jonrsharpe
你把它和指针混淆了,使用指针改变值会同时改变该指针引用的所有其他值。在这里,一个新对象被创建并且 base.cars 的引用被更改,但 a 的引用仍然保持不变。 - Gaurav Punjabi
我在控制台日志中得到的是 object object。你是说你在 console.log(base) 的返回结果中没有得到 object 吗?使用你提供的完整代码,我无法再现你的结果。 - GetSet
1个回答

3
因为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 --------+         

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接