js 陣列物件深拷貝

2021-10-08 16:29:02 字數 2427 閱讀 8283

如何區分深拷貝與淺拷貝,簡單點來說,就是假設b複製了a,當修改a時,看b是否會發生變化,如果b也跟著變了,說明這是淺拷貝,拿人手短,如果b沒變,那就是深拷貝,自食其力

我們希望在改變新的陣列(物件)的時候,不改變原陣列(物件)

我們在使用深拷貝的時候,一定要弄清楚我們對深拷貝的要求程度:是僅「深」拷貝第一層級的物件屬性或陣列元素還是遞迴拷貝所有層級的物件屬性和陣列元素?

改變任意乙個新物件/陣列中的屬性/元素,     都不改變原物件/陣列

1.直接遍歷

var array = [1, 2, 3, 4];

function copy (array)

return  newarray;

}var copyarray = copy(array);

copyarray[0] = 100;

console.log(array); // [1, 2, 3, 4]

console.log(copyarray); // [100, 2, 3, 4]

2. slice()和concat()

1.直接遍歷

var obj = 

function copy (obj) ;

for (let item in obj )

return newobj;} 

var copyobj = copy(obj);

copyobj.name = '我才不是彭湖灣呢! 哼 (。・`ω´・)';

console.log(obj); //

console.log(copyobj); //

2.es6的object.assign

var obj = 

var copyobj = object.assign({}, obj);

copyobj.name = '我才不叫彭湖灣呢! 哼  (。・`ω´・)';

console.log(obj);   //

console.log(copyobj);  //

object.assign:用於物件的合併,將源物件(source)的所有可列舉屬性,複製到目標物件(target),並返回合併後的target

3.es6擴充套件運算子:

var obj = 

var copyobj =

copyobj.name = '我才不叫彭湖灣呢! 哼  (。・`ω´・)'

console.log(obj.name) //   彭湖灣

console.log(copyobj.name)  // 我才不叫彭湖灣呢! 哼  (。・`ω´・)

擴充套件運算子(...)用於取出引數物件的所有可遍歷屬性,拷貝到當前物件之中

4.jquery淺拷貝var copiedobject = jquery.extend({}, originalobject)如果改變了originalobject,copiedobject 也會變。

對多層巢狀物件,很遺憾,上面四種方法,都會失敗:

1.不僅拷貝第一層級,還能夠拷貝陣列或物件所有層級的各項值

2. 不是單獨針對陣列或物件,而是能夠通用於陣列,物件和其他複雜的json形式的物件

1.json.parse(json.stringify(obj))

當obj為物件時,這個方法會省略那些值為 functions 和 undefined 的屬性,值為null還返回null

當obj為陣列時,如果陣列裡有function 、undefined、null,序列化後都變成null

2.手動寫遞迴

var array = [,,

];function copy (obj) ;

if(typeof obj !== 'object')

for(var i in obj)

return newobj

}var copyarray = copy(array)

copyarray[0].number = 100;

console.log(array); //  [, , ]

console.log(copyarray); // [, , ]

3.jquery深拷貝var copiedobject = $.extend(true, {}, originalobject)

js陣列,物件深拷貝

無事,封裝了乙個js深拷貝的方法 基本思路 deepcopy data data 可能是陣列也可能是物件 1.判斷data是陣列 物件或者其他資料型別 2.宣告空陣列 或者 空物件 res 3.分別處理 如果陣列元素或物件屬性值不是陣列或物件,空陣列或物件之間接收元素 res.push data i...

js 陣列物件深拷貝

結論 物件的拷貝不能採用直接賦值的方式。踩過的坑如下 formdata本來是父元件傳過來的,但是我不想直接用,於是我直接賦值給乙個formdatacopy的物件。但是詭異的事情發生了,就是在我填寫自己的表單元件的時候,一旦表單的資料發生的變化時,本來是formdatacopy的值發生變化,但是 fo...

js 陣列物件深拷貝

結論 物件的拷貝不能採用直接賦值的方式。踩過的坑如下 formdata本來是父元件傳過來的,但是我不想直接用,於是我直接賦值給乙個formdatacopy的物件。但是詭異的事情發生了,就是在我填寫自己的表單元件的時候,一旦表單的資料發生的變化時,本來是formdatacopy的值發生變化,但是 fo...