JavaScript:如何制作一个对象的副本?

这个问题在这里已经有了答案:

  • 在JavaScript中深入克隆对象的最有效方法是什么? 57个答案
  • 在JavaScript中克隆对象[复制] 3个答案

  • 使用Javascript对象和equals( = )运算符时,必须小心。 该运算符不会创建该对象的副本,而只会分配对原始内部对象的引用。

    这意味着在你的情况下,b 不会存储a的值,但在调用之后

    var b = a;
    

    a和b都指向内存中的同一个对象! 因此,更改b的任何属性也会将它们更改为(再次:它们是内部相同的对象)。

    要创建一个对象的副本,您必须手动复制它的每个属性:

    var a = {};  // create an empty object
    a.prop1 = 1; // set a property of this object
    var b = {};  // create another empty object
    b.prop1 = a.prop1; // copy all properties (in this case: only one) of a to b
    b.test = 1;  // add a new property to b
    alert(a.test); // => undefined, as .test is only defined for b
    a === b; // => false, as a and b are different objects.
    

    克隆JS对象问题的优雅解决方案可以在这里找到:我如何正确地克隆JavaScript对象?


    用普通的JavaScript你可以做到:

    var copy = JSON.parse(JSON.stringify(myObj));
    

    请参阅:http://jsfiddle.net/kukiwon/AyKdL/


    如何使用下面的深层复制模式。 这是来自Stoyan Stefanov的“Javascript Patterns”。

    function extendDeep(parent, child) {
        var i,
            toStr = Object.prototype.toString,
            astr = "[object Array]";
    
        child = child || {};
    
        for (i in parent) {
            if (parent.hasOwnProperty(i)) {
                if (typeof parent[i] === "object") {
                    child[i] = (toStr.call(parent[i]) === astr) ? [] : {};
                    extendDeep(parent[i], child[i]);
                } else {
                    child[i] = parent[i];
                }
            }
        }
        return child;
    }
    
    链接地址: http://www.djcxy.com/p/6953.html

    上一篇: JavaScript: How to make a copy of a object?

    下一篇: Create deep copy in angular 2