为什么JS-Objects的行为如下?

时间:2014-02-12 13:13:08

标签: javascript json object

var alpha = { a: 0, b: 0 };
var beta= alpha;
beta.b = 1;

现在alpha.b是1。

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

3 个答案:

答案 0 :(得分:4)

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)

答案 1 :(得分:2)

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

你想要的是克隆 alpha对象。我想你现在可以找到许多现有的实现,你知道要搜索的单词。

由于您的问题有JSON标记,我只是给出一个简单的实现(对循环对象不起作用):

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

答案 2 :(得分:0)

因为javascript变量保持对对象的引用。您将希望克隆一个对象以断开指向alpha.b。

的链接

请参阅:What is the most efficient way to deep clone an object in JavaScript?