对象深度clone
JavaScript中如何对一个对象进行深度clone?
一道百出不厌的面试题。
方式
上一篇写到了 引用数据类型 这里就会用上了
var a = [9, 5, 2, 7];
var b = a;
a.push(0);
console.log(b); // [9, 5, 2, 7, 4]
由于引用类型数据存储在应用地址内存中,因此赋值复制的也是这一块地址,因此相当于两个数组对象引用了一块数据地址,所以对a或者b的任何操作或者改变都会体现在对象中。
function clone(obj){
var buf;
if(obj instanceof Array){
buf = [];
var i = obj.length;
while(i--){
buf[i] = clone(obj[i]);
}
return buf;
}
else if(obj instanceof Object){
buf = {};
for(var k in obj){
buf[k] = clone(obj[k]);
}
return buf;
}
else{
return obj;
}
}
利用三元运算符 可以让代码更精简一点 毕竟提高效率也是程序员必不可少的技能嘛~
function clone(obj) {
var o = obj instanceof Array ? [] : {};
for(var k in obj)
o[k] = typeof obj[k] === Object ? clone(obj[k]) : obj[k];
return o;
}
var a = [[1, 2, 3], [4, 5, 6, 7]];
var b = clone(a);
console.log(b);
再讲一种上一篇提到的 object.prototype.toString.call()的方法
Object.clone=function(obj){
if (typeof (obj)=="object"){
var o =Object.prototype.toString.call(obj) == "[object Array]"?[]:{};
for(var key in obj){
if (obj.hasOwnProperty(key)){
//如果key是obj的自有属性
o[key]=arguments.callee(obj[key]);
//arguments.callee(obj[key])调的是当前的object.clone函数;
}
}return o;
}else {
//如果obj是原始数据类型的值,就直接返回副本
return obj;
}
}