javascript中的重复对象

use*_*625 7 javascript object

我看到两种复制对象的方法

1.

var a={c:1}
var b=a;
alert(b.c);//alert 1
Run Code Online (Sandbox Code Playgroud)

2.

var a={c:2};
var b={};
for (i in a)
{b[i]=a[i];} 
alert(b.c);//alert 1
Run Code Online (Sandbox Code Playgroud)

第一个比第二个短,那么第二个例子的效率是多少?

and*_*lrc 12

在第一个版本中,您不会复制/克隆对象,只需对其进行额外的引用:

var a = { a: 1 };
var b = a;
b.a = 2;

console.log(a.a); // 2;
Run Code Online (Sandbox Code Playgroud)

要克隆一个对象,有许多库可以为您做到这一点:

var b = $.extend({}, a); // Make a shallow clone (jQuery)
var b _.extend({}, a); // Make a shallow clone (underscore.js)

var b = $.extend(true, {}, a); // Make a deep clone (jQuery);
Run Code Online (Sandbox Code Playgroud)

或者你可以原生地做:
简单的克隆:

var b = {};
var prop;

for (prop in a) {
    b[prop] = a[prop];
}
Run Code Online (Sandbox Code Playgroud)

深度克隆功能的划痕:

function deepClone(obj) {
    var r;
    var i = 0,
    var len = obj.length;
    // string, number, boolean
    if (typeof obj !== "object") { 
        r = obj;
    }
    // Simple check for array
    else if ( len ) { 
        r = [];
        for ( ; i < len; i++ ) {
            r.push( deepClone(obj[i]) );
        }
    } 
    // Simple check for date
    else if ( obj.getTime ) { 
        r = new Date( +obj );
    }
    // Simple check for DOM node
    else if ( obj.nodeName ) { 
        r = obj;
    }
    // Object
    else { 
        r = {};
        for (i in obj) {
            r[i] = deepClone(obj[i]);
        }
    }

    return r;
}
Run Code Online (Sandbox Code Playgroud)


Sir*_*rko 7

先不创建一个副本,但只是复制引用,所以ab点对操作后的同一个对象.

但是,在第二种情况下,每个属性都是单独复制的,因此创建了对象的"真实"副本a(只要属性中只有原始类型,否则你会在更深层次上遇到同样的问题).

所以在第一种情况下如果你改变b.c那么a.c也会改变,而在第二种情况下它不会改变.