深淺拷貝的理解
阿新 • • 發佈:2018-11-26
一、理解
1、深拷貝:當拷貝完一個物件的時候,其中一個物件的資料發生了變化,另一個物件的資料也會發生變化。
因為深拷貝拷貝的是索引
2、淺拷貝:當拷貝完一個物件的時候,其中一個物件的資料發生了變化,另外一個物件的資料 不會發生變化。
因為淺拷貝拷貝的是數值
二、知識點補充:
1、合併物件:
Object.assign()合併物件
引數1:需要合併的物件A
引數2:需要進行合併的物件B
.....
返回值是一個合併後的物件
2、堆 和 粘 的理解
棧:原則 先進後出 棧裡面基本上全部都是放的基本資料型別 和 索引 地址 堆: 堆裡面基本上全部都是放的引用資料型別 資料都存放在堆裡面 而索引都存在棧裡面
三、淺拷貝的使用
//拷貝的物件是多層的情況
例:
var obj = {
person:{
name:"QQQ",
age:33,
sex:"女"
}
}
方案一:
var newObj = Object.assign({},obj)
console.log(newObj);
newObj.person.name = "AAA";
console.log(obj,newObj)
方案二:
//合併物件 跟Object.assign用法一樣
var newObj = $.extend({},obj) ;
console.log(newObj)
newObj.person.name = "AAA";
console.log(obj,newObj)
方案三:
//封裝函式遍歷
function copyObj(obj){
var newObj = {};
for(var key in obj){
newObj[key] = obj[key]
}
return newObj;
}
var newObj = copyObj(obj);
newObj.person.name="AAA";
console.log(obj,newObj)
四、深拷貝的使用
分為:物件是單層和多層的情況
//物件是單層的情況
var obj = {
name:"WWW",
age:33,
sex:"不詳"
}
方案一:
var newObj = Object.assign({},obj);
console.log(newObj);
newObj.name = "EEE";
console.log(obj,newObj)
----------------------------------------------
//物件是多層的情況
var obj = {
person: {
name: "QQQ",
age: 33,
sex: "女"
}
}
方案二、
//前面加true,則表示淺拷貝(注意區別深拷貝)
var newObj = $.extend(true,{},obj)
console.log(newObj);
newObj.person.name = "AAA";
console.log(obj,newObj)
方案三:
//使用JSON.parse JSON.stringify
var newObj = JSON.parse(JSON.stringify(obj));
console.log(newObj);
newObj.person.name="AAA";
console.log(obj,newObj)