我看到两种复制对象的方法
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)
先不创建一个副本,但只是复制引用,所以a
和b
点对操作后的同一个对象.
但是,在第二种情况下,每个属性都是单独复制的,因此创建了对象的"真实"副本a
(只要属性中只有原始类型,否则你会在更深层次上遇到同样的问题).
所以在第一种情况下如果你改变b.c
那么a.c
也会改变,而在第二种情况下它不会改变.