1. 程式人生 > >深淺拷貝的理解

深淺拷貝的理解

一、理解

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)