亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

數(shù)組是引用類型

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

拷貝值類型

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

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

拷貝引用類型

好的,這里就會(huì)有點(diǎn)奇怪了!我們用同樣的方法拷貝數(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 ]

為什么原來(lái)的數(shù)組也受到了影響呢?好了,是因?yàn)椋耗憧截惖牟皇悄憧截惖?。說(shuō)人話,意思就是你拷貝的只是指向數(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)我使用展開擴(kuò)展符號(hào)...來(lái)拷貝一個(gè)數(shù)組,我只是淺拷貝了一個(gè)數(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ù)組也受到影響💩。為了解決這個(gè)問(wèn)題,就要用到深拷貝了。

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 ]

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

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
}

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

相關(guān)文章

  • 來(lái)自qq的javascript面試題

    來(lái)自qq的javascript面試題

    請(qǐng)指出一下代碼的性能問(wèn)題,并經(jīng)行優(yōu)化。
    2010-07-07
  • 簡(jiǎn)短幾句 通俗解釋javascript的閉包

    簡(jiǎn)短幾句 通俗解釋javascript的閉包

    什么是閉包呢?閉包就是函數(shù)實(shí)例執(zhí)行過(guò)程中動(dòng)態(tài)產(chǎn)生一個(gè)沒有被釋放資源的棧區(qū),也是一個(gè)預(yù)執(zhí)行的過(guò)程。
    2011-01-01
  • 微信小程序開發(fā)之map地圖組件定位并手動(dòng)修改位置偏差

    微信小程序開發(fā)之map地圖組件定位并手動(dòng)修改位置偏差

    這篇文章主要介紹了微信小程序開發(fā)之map地圖組件,定位,并手動(dòng)修改位置偏差,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • js實(shí)現(xiàn)隨機(jī)點(diǎn)名系統(tǒng)(實(shí)例講解)

    js實(shí)現(xiàn)隨機(jī)點(diǎn)名系統(tǒng)(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇js實(shí)現(xiàn)隨機(jī)點(diǎn)名系統(tǒng)(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • 微信小程序 配置頂部導(dǎo)航條標(biāo)題顏色的實(shí)現(xiàn)方法

    微信小程序 配置頂部導(dǎo)航條標(biāo)題顏色的實(shí)現(xiàn)方法

    這篇文章主要介紹了微信小程序 配置頂部導(dǎo)航條標(biāo)題顏色的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 最新評(píng)論