摘要:數(shù)組賦值問題涉及到拷貝堆棧空間基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的差異。把數(shù)組值重置成輸出結(jié)果是把數(shù)組值重置成輸出結(jié)果是親測用等方法進(jìn)行數(shù)組復(fù)制都是淺拷貝。
數(shù)組賦值問題涉及到拷貝、堆棧空間、基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的差異。(自行了解)
var arrA = [1,2,3,4,5]; var arrB = arrA; // 把B數(shù)組值重置成0; arrB.fill(0); console.log(arrA); console.log(arrB);
輸出結(jié)果是:arrA = [0,0,0,0,0], arrB = [0,0,0,0,0]
arrB的修改的同時也修改了arrA的值。
可采用淺拷貝和深拷貝解決問題:
淺拷貝子對象是基礎(chǔ)數(shù)據(jù)類型的修改不受影響,子對象是引用數(shù)據(jù)類型仍然會受影響
深拷貝,子對象是引用數(shù)據(jù)類型也不受影響。
var arrA = [1, 2, 3, 4, 5]; var arrB = arrA.slice(0, 5); // 把B數(shù)組值重置成0; arrB.fill(0); console.log(arrA); console.log(arrB);
輸出結(jié)果是:arrA = [1, 2, 3, 4, 5], arrB = [0, 0, 0, 0, 0];
var arrA = [1, 2, [3, 4], 5, 6]; var arrB = arrA.slice(0, 5); // 把B[2]數(shù)組值重置成0; for (var i = 0; i < arrB.length; i++) { if (arrB[i].length > 0) { arrB[i].fill(0); } } console.log(arrA); console.log(arrB);
輸出結(jié)果是:arrA = [1, 2, [0,0], 5, 6], arrB = [1, 2, [0,0], 5, 6];
親測: 用arrA.slice()/arrA.concat()/[...arrA]/Array.from(arrA)/Array.prototype.push.apply(arrB, arrA)/ arrA.map(function(item){return item;});等方法進(jìn)行數(shù)組復(fù)制都是淺拷貝。
(Object.assign({}, objA)對象淺拷貝)
var arrA = [1, 2, [3, 4], 5, 6]; var arrB = JSON.parse(JSON.stringify(arrA)); // 把B數(shù)組值重置成0; arrB[2].fill(0); console.log(arrA); console.log(arrB);
輸出結(jié)果是:arrA = [1, 2, [3, 4], 5, 6], arrB = [1, 2, [0, 0], 5, 6];
var arrA = [1, undefined, [3, 4], 5, 6]; var arrB = JSON.parse(JSON.stringify(arrA)); // 把B數(shù)組值重置成0; arrB[2].fill(0); console.log(arrA); console.log(arrB);
輸出結(jié)果是:arrA = [1, undefined, [3, 4], 5, 6], arrB = [1, null, [0, 0], 5, 6];
親測: JSON.parse(JSON.stringify(arrA))JSON轉(zhuǎn)換是深拷貝,但是如果值為undefined會被轉(zhuǎn)為null。
let arrA = [1, 2, [3, 4], 5, 6]; let arrB = _.cloneDeepWith(arrA); // 把B數(shù)組值重置成0; arrB[2].fill(0); console.log(arrA); console.log(arrB);
輸出結(jié)果是:arrA = [1, undefined, [3, 4], 5, 6], arrB = [1, null, [0, 0], 5, 6];
可使用第三方庫如lodash封裝的方法。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/100572.html
摘要:從而也引出了所謂的深淺復(fù)制問題。附注對于淺復(fù)制,其實還有其他的實現(xiàn)方式,比如數(shù)組中和方法,對于這些還是希望大家自己了解,本本主要針對深淺復(fù)制的實現(xiàn)原理進(jìn)行解析。 前言 在之前寫繼承的過程談到了深淺復(fù)制的問題,因為有讀者反映到需要解析,趁今天周末寫一篇解析,今天的主體相對之前來說理解難度低一些,篇幅可能也比較短,諸君按需閱讀即可。 從兩種數(shù)據(jù)類型說起 在js中,變量的類型可以大致分成兩種...
摘要:基本數(shù)據(jù)類型將變量和值一起放在棧內(nèi)存引用數(shù)據(jù)類型則將變量放在棧內(nèi)存而將值放在堆內(nèi)存。該怎么理解沒圖我說個假設(shè)有個變量在內(nèi)存中是這樣的棧內(nèi)存中的變量指向堆內(nèi)存中一塊內(nèi)存相當(dāng)于持有該內(nèi)存的指針,而那塊內(nèi)存中存儲變量的相關(guān)內(nèi)容。 趁著周五沒那么忙,抽個空整理一下最近使用比較頻繁的一個小技術(shù) 對象的深復(fù)制。感覺啊,這個標(biāo)題和今天的節(jié)日(假裝不知道原來是情人節(jié))那么遙相呼應(yīng)。啊,沒有女朋友?沒有...
摘要:那么如何切斷和之間的關(guān)系呢,可以拷貝一份的數(shù)據(jù),根據(jù)拷貝的層級不同可以分為淺拷貝和深拷貝,淺拷貝就是只進(jìn)行一層拷貝,深拷貝就是無限層級拷貝。 深拷貝 vs 淺拷貝 深拷貝和淺拷貝都是針對的引用類型,JS中的變量類型分為值類型(基本類型)和引用類型;對值類型進(jìn)行復(fù)制操作會對值進(jìn)行一份拷貝,而對引用類型賦值,則會進(jìn)行地址的拷貝,最終兩個變量指向同一份數(shù)據(jù)。 // 基本類型 var a = ...
摘要:在之前的文章專題之?dāng)?shù)據(jù)類型和類型檢測中我有講過,中的數(shù)據(jù)類型分為兩種,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,基本數(shù)據(jù)類型是保存在棧的數(shù)據(jù)結(jié)構(gòu)中的是按值訪問,所以不存在深淺拷貝問題。 前言 在開發(fā)過程中,偶爾會遇到這種場景,拿到一個數(shù)據(jù)后,你打算對它進(jìn)行處理,但是你又希望拷貝一份副本出來,方便數(shù)據(jù)對比和以后恢復(fù)數(shù)據(jù)。 那么這就涉及到了 JS 中對數(shù)據(jù)的深淺拷貝問題,所謂深淺拷貝,淺拷貝的意思就是,...
閱讀 1839·2021-09-14 18:03
閱讀 2274·2019-08-30 15:48
閱讀 1129·2019-08-30 14:09
閱讀 515·2019-08-30 12:55
閱讀 2735·2019-08-29 11:29
閱讀 1494·2019-08-26 13:43
閱讀 2318·2019-08-26 13:30
閱讀 2376·2019-08-26 12:17