日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深拷贝几种方法

發布時間:2023/12/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深拷贝几种方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#深拷貝指的是:將原對象的各個屬性逐個復制出去,而且將原對象各個屬性所包含的對象也依次采用深復制的方法遞歸復制到新對象上。并開辟了一塊新的內存地址來存放復制的對象。

當對對象a進行深拷貝給對象b后,之后無論是對a操作還是對b操作,都是指改變自己的內容。實現深拷貝的方法有很多種,如下:

#1、JSON.stringify/parse的方法

下面展示一些 內聯代碼片。

// A code block var foo = 'bar'; // An highlighted block let arr1 = [1,2,3,4]; let arr2 = JSON.parse(JSON.stringify(arr1)); arr2.push(5); console.log(arr1); //[1, 2, 3, 4] console.log(arr2); //[1, 2, 3, 4, 5]const obj1 = {a:'a',b:'b'}; const obj2 = JSON.parse(JSON.stringify(obj1));0bj2.a = 'aa';console.log(0bj1); // {a:'a',b:'b'}; console.log(0bj2); // {a:'aa',b:'b'};

對于簡單的對象使用該方法是可以正常進行深拷貝的,但是如果對象中含有function則會出現問題
下面展示一些 內聯代碼片。

// A code block var foo = 'bar'; // An highlighted block const obj = {name:'zhangsan',fn:function(){console.log('Hello World');} } console.log(obj); // {name: "zhangsan", fn: ?} const obj2 = JSON.parse(JSON.stringify(obj)); console.log(obj2); // {name: "zhangsan"}

#JSON.stringify/parse實現深拷貝的時候,需要求目標對象(非 undefined,function)

#2、使用遞歸方法

使用遞歸方法,就是對每一層的數據都實現一次 創建對象->對象賦值的操作
下面展示一些 內聯代碼片。

// A code block var foo = 'bar'; // An highlighted block function deepClone(item){const target = item.constructor === Array ? [] : {}; // 判斷復制的目標是數組還是對象for(let keys in item){ // 遍歷目標if(item.hasOwnProperty(keys)){if(item[keys] && typeof item[keys] === 'object'){ // 如果值是對象,就遞歸一下target[keys] = item[keys].constructor === Array ? [] : {};target[keys] = deepClone(item[keys]);}else{ // 如果不是,就直接賦值target[keys] = item[keys];}}}return target; }const obj1 = {a:'a',b:'b'}; const obj2 = deepClone(obj1);obj2.a = 'aa';console.log(obj1); // {a:'a',b:'b'}; console.log(obj2); // {a:'aa',b:'b'};const obj3 = {name:'zhangsan',fn:function(){console.log('Hello World');} } console.log(obj3); // {name: "zhangsan", fn: ?} const obj4 = deepClone(obj3); console.log(obj4); // {name: "zhangsan", fn: ?}

改函數可以深拷貝數組、對象、以及帶函數的對象。
————————————————
版權聲明:本文為CSDN博主「魚丸粗面不要香菜」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41080490/article/details/82493394

總結

以上是生活随笔為你收集整理的深拷贝几种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。