【问题标题】:Objects inside a loop different to outside循环内部的对象与外部不同
【发布时间】:2019-12-24 09:13:22
【问题描述】:

循环内的对象与外部的对象具有不同的值。我似乎无法找出值如何变化。

f = console.log
a = ["b","c"]
o ={d:1,e:2}
a.forEach(x=>{
  o.k = x
  window[x]=o;
  f("inside the loop we have "+ x + ":")
  f(window[x])
})
f("outside the loop we have b:")
f(b)
f("outside the loop we have c:")
f(c)

奇怪的是输出是:

inside the loop we have b: 
Object { d: 1, e: 2, k: "b" }
inside the loop we have c: 
Object { d: 1, e: 2, k: "c" }
outside the loop we have b: 
Object { d: 1, e: 2, k: "c" }
outside the loop we have c: 
Object { d: 1, e: 2, k: "c" }

为什么值b.k 更改为"c"?如果觉得这很奇怪。但显然我在这里没有什么。

【问题讨论】:

    标签: javascript loops object


    【解决方案1】:

    在您的示例中,o 是一个共享对象。在这一行:

    a.forEach(x=>{
      o.k = x
    

    在第一遍中,x"b",所以o.k = "b"。但是第二次迭代,x 被设置为"c",所以o.k = "c"。然后在此之后没有更多的循环。 由于o.k 发生的最后一件事是将其设置为"c",现在o 如下所示:

    Object { d: 1, e: 2, k: "c" }
    

    这就是为什么你会看到它在最后打印出来。

    【讨论】:

      【解决方案2】:

      javascript 中的对象分配发生在引用级别,而不是值级别。

      这意味着当您执行window[x] = o 时,您将对对象“o”的相同引用分配给window.b 和window.c。因此,当您执行o.k = x 时,您将更改对象“o”中的值“k”,从而更改对该对象的所有引用。这种简单对象的解决方案可能是在分配之前创建 o 的 SHALLOW 副本,从而将引用分配给具有相同值的新对象。使用扩展运算符可以轻松实现这一点。 尝试将window[x] = o 更改为window[x] = {...o}

      【讨论】:

        猜你喜欢
        • 2015-08-29
        • 1970-01-01
        • 1970-01-01
        • 2022-09-24
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        相关资源
        最近更新 更多