【问题标题】:OO Javascript copy of object [duplicate]对象的OO Javascript副本[重复]
【发布时间】:2015-09-28 13:08:45
【问题描述】:

我有一个关于 javascript 如何使用以下示例代码复制对象的问题:

var blue = {a:1};
var yellow = blue
yellow = 3;

在这种情况下,作为 a=1 的对象,蓝色的值不会受到影响。但是,当这样写时:

var blue = {a:1};
blue.b = 2;
var yellow = blue
yellow.c = 3;`

在这种情况下,console.log(blue) 会显示蓝色,它的对象中也有一个额外的 {c:3}。当yellow = blue 应该只是黄色引用蓝色而不是相反时,变量蓝色如何受到黄色的影响?

【问题讨论】:

  • 这是因为yellow 设置为蓝色的“参考”。您不会更改蓝色,而是将值从参考更改为另一个值。我写过这个here
  • 你不能在 JavaScript 中原生地“复制”对象。它们与 C++ 等语言中的指针相似
  • 不知道为什么这被否决了这么多。这似乎是对 javascript 工作原理的天真的误解。
  • 这表明完全缺乏研究。
  • 谢谢大家的回答。你是对的,Kith,我不知道我在这里问的概念是什么合适的词,因为我今天刚刚通过反复试验学到了它。我现在正在学习它们被称为按值/引用传递,因为在这里询问。反对票或赞成票对我来说并不重要,哈哈。我从询问中学到了,这才是最重要的。

标签: javascript


【解决方案1】:

当您为变量赋值时,该变量之前的任何值都将消失。这就是您的第一个示例中发生的情况。

当您将变量分配给作为对象的值,然后修改该对象(将其属性设置为某个值)时,您仍然有该变量指向该对象。这就是您的第二个示例中发生的情况。

在您的第二个示例中发生的另一件事是 blueyellow 指向同一个对象,因此通过 blue 修改与通过 yellow 修改相同,并且在这两种情况下都“适用” " 到两个变量(它总是同一个对象)

【讨论】:

    【解决方案2】:

    第一种情况:

    var blue = {a:1};
    var yellow = blue;   // yellow references blue...
    
    yellow = 3;          // but not anymore. Now it's just a number.
    

    第二个:

    var blue = {a:1};
    blue.b = 2;
    
    var yellow = blue    // yellow references blue
    yellow.c = 3;        // and still does, so yellow.c and blue.c are the same`
    

    【讨论】:

      【解决方案3】:

      在 JS 中,所有的赋值都是按值完成的。

      但是,在对象的情况下,该值是一个引用。

      也就是说,如果您使用yellow = blueyellowblue 将在内存中包含相同的对象。所以你不能改变一个而不修改另一个。

      【讨论】:

        猜你喜欢
        • 2018-08-08
        • 1970-01-01
        • 2014-11-26
        • 1970-01-01
        • 1970-01-01
        • 2011-09-28
        • 2019-04-08
        相关资源
        最近更新 更多