淺拷貝
復(fù)雜數(shù)據(jù)類型的數(shù)據(jù)復(fù)制的是地址着绷,修改會(huì)被“共享”
方式一,使用copyObj[key] = obj[key]
var obj = {name: 'David', age: 18, pets: ['阿貓', '阿狗']};
var copyObj = {};
for(var key in obj){
copyObj[key] = obj[key];
}
obj.name = '周杰倫';
obj.pets.push('小黑');
console.log(obj); // name:'周杰倫', age:18, pets:["阿貓", "阿狗", "小黑"]
console.log(copyObj); // name:'David', age:18, pets:["阿貓", "阿狗", "小黑"]
方式二锌云,使用Object.assign()
var obj = {name: 'David', age: 18, pets: ['阿貓', '阿狗']};
var copyObj = {};
Object.assign(copyObj, obj, {address: '廣州'});
obj.name = '周杰倫';
obj.pets.push('小黑');
console.log(obj); // name:'周杰倫', age:18, pets:["阿貓", "阿狗", "小黑"]
console.log(copyObj); // name:'David', age:18, address:'廣州', pets:["阿貓", "阿狗", "小黑"]
深拷貝
復(fù)雜數(shù)據(jù)類型的數(shù)據(jù)復(fù)制到新的地址荠医,修改不會(huì)被“共享”
var obj = {
name: 'David',
age: 18,
friends: ['小明', '小紅', '小黑'],
bestFriend: {
name: '小黑',
age: 19,
address: '廣州',
pets: [{name: '土豆'}, {name: '馬鈴薯'}]
},
birthday: new Date()
};
function deepCopy2NewObj(fromObj, toObj) {
for(var key in fromObj){
var fromValue = fromObj[key];
if(!isObj(fromValue)){
toObj[key] = fromValue;
}else{
var tempObj = new fromValue.__proto__.constructor;
deepCopy2NewObj(fromValue, tempObj); // 遞歸
toObj[key] = tempObj;
}
}
}
function isObj(obj) {
return obj instanceof Object;
}
function isArr(obj) {
return Array.isArray(obj);
// return Object.prototype.toString.call(obj) === '[object Array]'; // 方式2
}
var newObj = {};
deepCopy2NewObj(obj, newObj);
console.log(obj);
console.log(newObj);