【问题标题】:javascript object reference not work as expected [duplicate]javascript对象引用无法按预期工作[重复]
【发布时间】:2020-02-09 21:56:52
【问题描述】:

谁能解释一下下面这段代码发生了什么?为什么它会这样工作?我预计变量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?

【问题讨论】:

  • 不清楚你为什么会这样。您正在为该属性分配一个新值,但这不会改变对旧值的任何其他引用。
  • 您将它与指针混淆了,其中使用指针更改值会更改使用该指针引用的所有其他值。在这里,创建了一个新对象,base.cars 的引用发生了变化,但 a 的引用保持不变。
  • 我正在获取控制台日志的对象对象。你是说你没有得到object作为console.log(base)的返回结果。我无法使用您的确切代码重现您的结果。

标签: javascript object reference


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2020-04-23
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多