【问题标题】:Why do JS-Objects behave like this?为什么 JS-Objects 会这样?
【发布时间】:2014-03-10 20:09:40
【问题描述】:
var alpha = { a: 0, b: 0 };
var beta= alpha;
beta.b = 1;

现在alpha.b 是 1。

为什么会发生这种情况,我该怎么做才能保持alpha.b 0?

【问题讨论】:

    标签: javascript json object


    【解决方案1】:

    alphabeta 是变量,其值是同一对象的引用。

    您想要克隆 alpha 对象。既然您知道要搜索的词,我想您会发现许多现有的实现。

    由于你的问题有 JSON 标签,我只给出一个简单的实现(不适用于循环对象):

    var beta = JSON.parse(JSON.stringify(alpha));
    

    【讨论】:

    • 解释为什么会发生这种情况可能对 OP 有帮助。
    • 啊 :D 非常感谢!
    • 它可以使用替换器来处理循环对象。
    • @plalx 是的(见我的related question),但它要贵得多。而且它仍然不适用于非常大的对象(例如window)。
    【解决方案2】:

    alpha 和 beta 都是指向内存中相同的引用(即分配的堆)。因此,每当您更改一个对象的属性时,这都会立即反映在另一个对象上;因为它们本质上指向同一个对象。

    你应该将所有属性从 alpha 复制到 beta

    var alpha = { a: 0, b: 0 },
    beta = { };
    
    for(var prop in alpha){
         if(alpha.hasOwnProperty(prop)){
            beta[prop] = alpha[prop];   
         }
    }
    

    你的对象有点简单。您可能会遇到嵌套对象的情况,例如

    var alpha = {
        propA: {},
        propB: {}
    }
    

    在这种情况下,您需要所谓的深度克隆;那就是你需要递归地克隆复杂的属性。

    如果您已经在使用 jquery,您可以利用 extend 方法

     $.extend(true, beta, alpha)
    

    【讨论】:

    • 这不是深度克隆。
    【解决方案3】:

    因为 javascript veriable 保留了对对象的引用。您将需要克隆一个对象以断开与 alpha.b 的链接。

    见:What is the most efficient way to deep clone an object in JavaScript?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2011-06-03
      • 2018-06-08
      • 2014-12-21
      • 1970-01-01
      相关资源
      最近更新 更多