JS中的深淺拷貝

這幾乎是前端面試的高頻問題。

什么是深淺拷貝?

淺拷貝
var a = {name:'steven'}
var b = a 
b.name = "bob"
console.log(a) // {name:'bob'}
console.log(b) // {name:'bob'}

把對象a的值賦值給b,再修改b.name的值, a.name的值跟著一起改變了,這就是淺拷貝。
非專業(yè)解釋: 因?yàn)閍 和 b的指針指向同一個內(nèi)存空間,賦值只是對指針進(jìn)行了拷貝,故為淺拷貝。

深拷貝

顯而易見,深拷貝就是要修改b.name時, a.name的值不變。 說白了就是新開辟一塊內(nèi)存空間存儲b。

第一種方法
目標(biāo)對象只有一層如 {name:'steven'}

var a = {name:'steven'}
var b = JSON.parse(JSON.stringify(a))
// 先將其JSON序列化,再解析,得到深拷貝的a
b.name = 'bob'
console.log(a) // {name:'steven'}
console.log(b) // {name:'bob'}

不太建議使用。
缺點(diǎn):深拷貝之后,不管這個對象原來的構(gòu)造函數(shù)是什么,在深拷貝之后都會變成Object。同時如果對象中存在循環(huán)引用的情況也無法正確處理。 引用:https://blog.csdn.net/yangyixue123/article/details/79687859

第二種方法

var a = {name:'steven'}
var b = Object.assign({},a)
// 使用ES6的Object.assign方法
b.name = 'bob'
console.log(a) // {name:'steven'}
console.log(b) // {name:'bob'}

第三種方法,寫一個遞歸方法

function deepCopy(obj) {
        var result = Array.isArray(obj) ? [] : {};
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) {
                if (typeof obj[key] === 'object') {
                    result[key] = deepCopy(obj[key]);   //遞歸復(fù)制
                } else {
                    result[key] = obj[key];
                }
            }
        }
        return result;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,662評論 1 32
  • 307、setValue:forKey和setObject:forKey的區(qū)別是什么? 答:1, setObjec...
    AlanGe閱讀 1,720評論 0 1
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,594評論 0 6
  • 1.設(shè)計模式是什么? 你知道哪些設(shè)計模式,并簡要敘述?設(shè)計模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,302評論 0 12
  • 如果有一天, 我能夠通過自己的努力, 改變我的家庭, 和我自己, 那便是一種救贖。
    肖可愛_Christal閱讀 405評論 0 3

友情鏈接更多精彩內(nèi)容