<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          4種Javascript實(shí)現(xiàn)深拷貝的方式

          共 2351字,需瀏覽 5分鐘

           ·

          2022-07-13 13:19

          來源 | https://www.fly63.com

          概念介紹

          • 深拷貝:在堆內(nèi)存中重新開辟一個(gè)存儲(chǔ)空間,完全克隆一個(gè)一模一樣的對(duì)象;
          • 淺拷貝:不在堆內(nèi)存中重新開辟空間,只復(fù)制棧內(nèi)存中的引用地址。
          本質(zhì)上兩個(gè)對(duì)象(數(shù)組)依然指向同一塊存儲(chǔ)空間

          01、遞歸方式(推薦,項(xiàng)目中最安全最常用)

          使用遞歸的方式進(jìn)行對(duì)象(數(shù)組)的深拷貝,奉上已封裝的深拷貝函數(shù):
          上方函數(shù)的使用方式:
          //函數(shù)拷貝    const copyObj = (obj = {}) => {            //變量先置空            let newobj = null;  
          //判斷是否需要繼續(xù)進(jìn)行遞歸 if (typeof (obj) == 'object' && obj !== null) { newobj = obj instanceof Array ? [] : {}; //進(jìn)行下一層遞歸克隆 for (var i in obj) { newobj[i] = copyObj(obj[i]) } //如果不是對(duì)象直接賦值 } else newobj = obj; return newobj; }

          上方函數(shù)的使用方式:

          //模擬對(duì)象let obj = {  numberParams:1,  functionParams:() => {    console.log('昨天基金全是綠的,只有我的眼睛是紅的');  },  objParams:{    a:1,    b:2  }}const newObj = copyObj(obj); //這樣就完成了一個(gè)對(duì)象的遞歸拷貝obj.numberParams = 100;  //更改第一個(gè)對(duì)象的指console.log(newObj.numberParams); //輸出依然是1 不會(huì)跟隨obj去改變

          02、JSON.stringify() ;(這個(gè)不推薦使用,有坑)

          這個(gè)方法有坑,詳細(xì)講解請(qǐng)看我另一篇文章 “使用JSON.stringify進(jìn)行深拷貝的坑” 以下是代碼示例:

          let obj = {  a:1,  b:"基金虧太多,終有一天,你站上了天臺(tái),我臥上了軌道。來生我們有說有笑。"}//先轉(zhuǎn)為json格式字符,再轉(zhuǎn)回來let newObj = JSON.parse(JSON.stringify(obj));
          obj.a = 50;console.log(newObj.a); //輸出 1

          普通的對(duì)象也可以進(jìn)行深拷貝,但是!!!當(dāng)對(duì)象內(nèi)容項(xiàng)為number,string.boolean的時(shí)候,是沒有什么問題的。但是,如果對(duì)象內(nèi)容項(xiàng)為undefined,null,Date,RegExp,function,error的時(shí)候。使用JSON.stringify()進(jìn)行拷貝就會(huì)出問題了。

          03、使用第三方庫lodash中的cloneDeep()方法

          是否推薦使用,看情況吧。如果我們的項(xiàng)目中只需要一個(gè)深拷貝的功能,這種情況下為了一個(gè)功能引入整個(gè)第三方庫就顯得很不值得了。不如寫一個(gè)遞歸函數(shù)對(duì)于項(xiàng)目來說性能更好。

          lodash.cloneDeep()代碼示例:

          import lodash from 'lodash';let obj = {  a: {      c: 2,      d: [1, 3, 5],      e:'阿巴阿巴'    },    b: 4}const newObj = lodash.cloneDeep(obj);obj.b = 20;console.log(newObj.b); //輸出 4; 不會(huì)改變

          實(shí)際上,cloneDeep()方法底層使用的本來就是遞歸方法。只是在外層又封裝了一層而已。

          所以,如果不是原先項(xiàng)目中有使用 lodash 這個(gè)庫的話,大可不必為了這一個(gè)功能而去引入它。

          文章上方有提供進(jìn)行深拷貝的函數(shù),推薦使用。大家可自取。

          04、jquery的extend()方法進(jìn)行深拷貝(推薦在JQ中使用)

          這個(gè)方法僅適用于JQuery構(gòu)建的項(xiàng)目。JQuery自身攜帶的extend()方法可以進(jìn)行深拷貝,不用自己寫遞歸也不用引入第三方庫還沒什么坑。

          在JQuery項(xiàng)目中的使用方式:

          let obj = {  a: {      c: 2,      d: [1, 3, 5],      e:'阿巴阿巴'    },    b: 4}let newObj= $.extend(true, {}, obj1);  //拷貝完成obj.b = 20;console.log(newObj.b); //輸出 4 

          總結(jié):

          進(jìn)行深拷貝的方法:

          • 遞歸函數(shù) (推薦使用,項(xiàng)目中使用的更多,更小,更安全)

          • JSON.stringify() 和JSON.parse() ; (不推薦使用,如果遇到Function,Date等類型的變量容易出現(xiàn)一些意料之外的問題)

          • 第三方庫lodash的cloneDeep()方法 (就情況而定,如果項(xiàng)目中原先就有l(wèi)odash這個(gè)第三方庫,可以使用,否則還是推薦使用遞歸函數(shù)。不然成本太高。)

          • JQuery的extend()函數(shù) (推薦在JQuery項(xiàng)目中使用,其他項(xiàng)目依然推薦是用遞歸函數(shù))


          學(xué)習(xí)更多技能

          請(qǐng)點(diǎn)擊下方公眾號(hào)

          瀏覽 20
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大陆AV高清无码在线播放 | 国产亲子乱一区二区 | 天堂AV手机版 | 翔田千里在线播放 | 国产乱妇乱子伦视频免费观看 |