最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

怎么使用javascript深度拷貝一個數(shù)組

 更新時間:2019年06月06日 14:56:05   作者:Ioodu  
一般情況下,使用 “=” 可以實現(xiàn)賦值。但對于數(shù)組、對象、函數(shù)等這些引用類型的數(shù)據(jù),這個符號就不好使了。下面我們來詳細學(xué)習(xí)下吧

有兩種數(shù)組拷貝類型:淺拷貝 & 深拷貝。淺拷貝只會拷貝數(shù)組的第一層,剩下的會引用。如果你需要一個嵌套的數(shù)組的拷貝,那需要你去深度拷貝這個數(shù)組。深拷貝,選擇JSON方法或者Lodsh庫吧

const numbers = [1, [2], [3, [4]], 5];
// Using JavaScript
JSON.parse(JSON.stringify(numbers));
// Using Lodash
_.cloneDeep(objects);

數(shù)組是引用類型

為了搞清楚為什么有兩種類型的拷貝,我們來深度了解一下基礎(chǔ)知識然后解釋什么是引用類型。
與原始類型(number、string)不同,數(shù)組是引用類型。這意味著當(dāng)你把一個數(shù)組賦值給一個變量,你是將數(shù)組的內(nèi)存地址而非數(shù)組本身賦給變量。

拷貝值類型

這里沒什么大不了的,我們創(chuàng)建一個value的拷貝。當(dāng)我們改變valueCopy的值,它不會影響原來的value值。同理,當(dāng)我們改變原來的值它也不會影響拷貝后的值。很好👍

let value = 3;
let valueCopy = value; // create copy
console.log(valueCopy); // 3
// Change valueCopy
valueCopy = 100
console.log(valueCopy); // 100
// ✅ Original NOT affected 
console.log(value); // 3

拷貝引用類型

好的,這里就會有點奇怪了!我們用同樣的方法拷貝數(shù)組。

let array = [1,2,3];
let arrayCopy = array; // create copy
console.log(arrayCopy); // [1,2,3];
// Change 1st element of the array
arrayCopy[0] = '👻';
console.log(arrayCopy); // [ '👻', 2, 3 ]
// ❌Original got affected
console.log(array); // [ '👻', 2, 3 ]

為什么原來的數(shù)組也受到了影響呢?好了,是因為:你拷貝的不是你拷貝的。說人話,意思就是你拷貝的只是指向數(shù)組內(nèi)存空間的指針。引用類型不包含值,它們是指向內(nèi)存中值的指針。

拷貝引用類型的方法

解決方法就是拷貝值而不是指針。

let array = [1,2,3];
let arrayCopy = [...array]; // create TRUE copy
console.log(arrayCopy); // [1,2,3];
// Change 1st element of the array
arrayCopy[0] = '👻';
console.log(arrayCopy); // [ '👻', 2, 3 ]
// ✅ Original NOT affected 
console.log(array); // [ 1, 2, 3 ]

淺 & 深 拷貝

當(dāng)我使用展開擴展符號...來拷貝一個數(shù)組,我只是淺拷貝了一個數(shù)組。如果數(shù)組是嵌套或者多維的,這就不奏效了。

let nestedArray = [1, [2], 3];
let arrayCopy = [...nestedArray];
// Make some changes
arrayCopy[0] = '👻'; // change shallow element
arrayCopy[1][0] = '💩'; // change nested element
console.log(arrayCopy); // [ '👻', [ '💩' ], 3 ]
// ❌ Nested array got affected
console.log(nestedArray); // [ 1, [ '💩' ], 3 ]

如上,淺拷貝首層數(shù)組表現(xiàn)良好,然而,更改了嵌套數(shù)組元素,原始數(shù)組也受到影響💩。為了解決這個問題,就要用到深拷貝了。

let nestedArray = [1, [2], 3];
let arrayCopy = JSON.parse(JSON.stringify(nestedArray));
// Make some changes
arrayCopy[0] = '👻'; // change shallow element
arrayCopy[1][0] = '💩'; // change nested element
console.log(arrayCopy); // [ '👻', [ '💩' ], 3 ]
// ✅ Nested array NOT affected
console.log(nestedArray); // 1, [ 2 ], 3 ]

所以,這就完事了嗎?要不要手寫一個深拷貝引用類型的方法?

const deepClone = obj => {
const isObject = args => (typeof args === 'object' || typeof args === 'function') && typeof args !== null
if (!isObject) throw new Error('Not Reference Types')
let newObj = Array.isArray(obj) ? [...obj] : { ...obj }
Reflect.ownKeys(newObj).map(key => {
newObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
})
return newObj
}

文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,

相關(guān)文章

  • 聊聊JavaScript中.?、??、??=的用法以及含義

    聊聊JavaScript中.?、??、??=的用法以及含義

    今天項目中突然遇到了不太明白的寫法,下面這篇文章主要給大家介紹了關(guān)于JavaScript中.?、??、??=的用法以及含義的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • JavaScript實現(xiàn)簡單輪播圖效果

    JavaScript實現(xiàn)簡單輪播圖效果

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)圖片輪播,左右翻轉(zhuǎn),圖片切換顯示等效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 僅9張思維導(dǎo)圖幫你輕松學(xué)習(xí)Javascript 就這么簡單

    僅9張思維導(dǎo)圖幫你輕松學(xué)習(xí)Javascript 就這么簡單

    僅9張思維導(dǎo)圖幫你輕松學(xué)習(xí)Javascript,從javascript變量、javascript運算符、javascript函數(shù)基礎(chǔ)等多方面了解Javascript,就這么簡單
    2016-06-06
  • 如何編寫一個 Webpack Loader的實現(xiàn)

    如何編寫一個 Webpack Loader的實現(xiàn)

    這篇文章主要介紹了如何編寫一個 Webpack Loader的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • js+css實現(xiàn)計算器功能

    js+css實現(xiàn)計算器功能

    這篇文章主要為大家詳細介紹了js+css實現(xiàn)計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • js實現(xiàn)數(shù)組的扁平化

    js實現(xiàn)數(shù)組的扁平化

    這篇文章主要為大家介紹了js實現(xiàn)數(shù)組扁平化,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Less 安裝及基本用法

    Less 安裝及基本用法

    這篇文章主要介紹了Less 安裝及基本用法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-05-05
  • Javascript中構(gòu)造函數(shù)要注意的一些坑

    Javascript中構(gòu)造函數(shù)要注意的一些坑

    JavaScript語言是一門面向?qū)ο蟮恼Z言,但JS中并沒有類的概念的。于是JavaScript采用構(gòu)造函數(shù)的方式來模擬類的效果,即我們通過函數(shù)來創(chuàng)建對象。這也證明了函數(shù)在JavaScript中具有非常重要的地位。本文主要介紹了Javascript中構(gòu)造函數(shù)的一些坑,需要的朋友可以參考。
    2017-01-01
  • 用js判斷輸入是否為中文的函數(shù)

    用js判斷輸入是否為中文的函數(shù)

    本篇文章主要是對js判斷輸入是否為中文的函數(shù)進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-03-03
  • js實現(xiàn)單擊可修改表格

    js實現(xiàn)單擊可修改表格

    這篇文章主要為大家詳細介紹了js實現(xiàn)單擊可修改表格,類似成績單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04

最新評論

安国市| 澄迈县| 游戏| 舟山市| 吴川市| 云林县| 灵石县| 永平县| 桃园县| 文成县| 琼中| 青龙| 金平| 隆尧县| 连州市| 溆浦县| 眉山市| 新昌县| 贵定县| 林西县| 运城市| 班戈县| 宁晋县| 东乡| 宜兰县| 云和县| 舟山市| 兖州市| 板桥市| 肇源县| 贡山| 平原县| 翼城县| 繁峙县| 莫力| 台安县| 民县| 阳城县| 泰兴市| 凭祥市| 洛川县|