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