javascript的淺拷貝和深拷貝是老生長談的問題了。淺拷貝是內存引用,修改一個會引起另一個跟着改變,當然只對object類型生效。今天看到一個深拷貝的方法:
var cloneObj = function(obj){
var str, newobj = obj.constructor === Array ? [] : {};
if(typeof obj !== 'object'){
return;
} else if(window.JSON){
str = JSON.stringify(obj), //系列化對象
newobj = JSON.parse(str); //還原
} else {
for(var i in obj){
newobj[i] = typeof obj[i] === 'object' ?
cloneObj(obj[i]) : obj[i];
}
}
return newobj;
};
深拷貝一般有兩種方式:一種是新建一個對象,然後循環賦予屬性和值,另外一種呢,利用JSON的stringify和parse方法實現。
迭代一個object的屬性值,可以用for in 循環,更好的方法是用Object.keys()方法。Object.keys方法返回一個對象可枚舉的屬性名的數組。它與for in循環的不同之處在於,for in會把_proto_裏的屬性名也迭代進去。所以,for in循環裏包含了hasOwnProperty爲false的屬性名。來看個例子
var Obj = function(){
this.a=1;
}
Obj.prototype.b=2;
var newObj = new Obj();
console.log(Object.keys(newObj)); //['a']
for(var i in newObj){
console.log(i); // a,b
if (newObj.hasOwnProperty(i)){
console.log(i); // a
}
}
另個附一個各種深拷貝的性能測試地址:https://jsperf.com/deep-copy-vs-json-stringify-json-parse/5#