摘要:舉個例子來說明一下什么是淺拷貝什么是深拷貝淺拷貝得出的結(jié)果可以看出是淺拷貝非對象的屬性值一個改變不影響另一個的值對象屬性是引用賦值所以一個改變會影響另一個的改變出現(xiàn)這種情況的本質(zhì)是對象是按引用賦值的深拷貝指的是拷貝一個對象,改變一個值不影響
舉個例子來說明一下什么是淺拷貝什么是深拷貝
淺拷貝var x = { a: 1, b: {f: { g: 1 }}, c: [1, 2, 3] }; var y = shallow(x);
得出的結(jié)果可以看出是淺拷貝
非對象的屬性值一個改變不影響另一個的值
對象屬性是引用賦值所以一個改變會影響另一個的改變
出現(xiàn)這種情況的本質(zhì)是:對象是按引用賦值的
指的是拷貝一個對象,改變一個值不影響另一個的值
// 實現(xiàn)深復(fù)制功能 // 判斷:1.是否是對象 2.是否是函數(shù) function deepCopy (obj, isDeep) { if (!_.isObject(obj)) { return obj } else { if (_.isFunction(obj)) { return new Function("return " + obj.toString())(); } else { var name, target = _.isArray(obj) ? [] : {}, value; for (name in obj) { value = obj[name]; // 是淺拷貝還是深拷貝 if (isDeep && (_.isArray(value) || _.isObject(value))) { console.log("深拷貝"); target[name] = deepCopy(value, isDeep); } else { console.log("淺拷貝"); target[name] = value } } return target; } } } var array3 = { a: 1, b: {f: { g: 1 }}, c: function () { console.log("is function"); } }; var array4 = deepCopy(array3, false);一個技巧
使用JSON對象的parse()和stringify()方法
pares() JSON字符串轉(zhuǎn)成js對象
stringify() 將js對象轉(zhuǎn)成JSON字符串
//例1 var source = { name:"source", child:{ name:"child" } } var target = JSON.parse(JSON.stringify(source)); target.name = "target"; //改變target的name屬性 console.log(source.name); //source console.log(target.name); //target //例2 var source = { name:function(){console.log(1);}, child:{ name:"child" } } var target = JSON.parse(JSON.stringify(source)); console.log(target.name); //undefined
這種方法有局限性:
對于正則表達式類型、函數(shù)類型等無法進行深拷貝(而且會直接丟失相應(yīng)的值)
它會拋棄對象的constructor,不管這個對象原來的構(gòu)造函數(shù)是什么,在深拷貝之后都會變成Object
參考lodash一些功能函數(shù)的使用
github js中淺拷貝和深拷貝的實現(xiàn)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88640.html
摘要:在中可以通過添加一個參數(shù)來實現(xiàn)遞歸,調(diào)用就可以實現(xiàn)一個深拷貝。利用序列化實現(xiàn)一個深拷貝 在JavaScript中,對于Object和Array這類引用類型值,當(dāng)從一個變量向另一個變量復(fù)制引用類型值時,這個值的副本其實是一個指針,兩個變量指向同一個堆對象,改變其中一個變量,另一個也會受到影響。 這種拷貝分為兩種情況:拷貝引用和拷貝實例,也就是我們說的淺拷貝和深拷貝 淺拷貝(shallow...
摘要:拷貝分為淺拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完全單純拷貝數(shù)據(jù)的值。所以,這種方法只是簡單繞過第一層箱子的引用復(fù)制深拷貝目前比較好的方法就是大法,要么就是自己寫遞歸的深拷貝函數(shù)。附帶深拷貝的自定義函數(shù)源自大佬的 經(jīng)常遇到數(shù)組或?qū)ο蟮纫妙愋妥鳛楹瘮?shù)的參數(shù)的情況,但又不想修改原來的數(shù)據(jù),這時候就需要拷貝(基本類型的變量不需要考慮)??截惙譃闇\拷貝和深拷貝。淺拷貝是引用復(fù)制,深拷貝是完...
摘要:引用類型值引用類型值是保存在堆內(nèi)存中的對象,變量保存的只是指向該內(nèi)存的地址,在復(fù)制引用類型值的時候,其實只復(fù)制了指向該內(nèi)存的地址。 前言 要理解 JavaScript中淺拷貝和深拷貝的區(qū)別,首先要明白JavaScript的數(shù)據(jù)類型。JavaScript有兩種數(shù)據(jù)類型,基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型。js的基本類型:undefined,null,string,boolean,number,s...
摘要:接下來就讓我們更細(xì)致的探究中的深淺拷貝??偨Y(jié)以上對深拷貝和淺拷貝做了簡單的介紹,在深拷貝的實現(xiàn)上也只介紹了最簡單的實現(xiàn)形式,并未考慮復(fù)雜情況以及相應(yīng)優(yōu)化,想要對深拷貝有更深入的了解,需要大家花時間去深入研究,或者可以關(guān)注我后續(xù)文章的動態(tài)。 對象和數(shù)組的拷貝對我來說一直都是一個比較模糊的概念,一直有點一知半解,但是在實際工作中又偶爾會涉及到,有時候還會一不小心掉坑里,不知道大家有沒有同樣...
摘要:淺拷貝和淺拷貝的問題,不僅在日常應(yīng)用中需要注意,而且在面試和筆試中也常被用來考察應(yīng)聘者,屬于文體兩開花的?;緮?shù)據(jù)類型引用數(shù)據(jù)類型等等基本數(shù)據(jù)類型是按值訪問的,對其的拷貝會直接復(fù)制其值保存在新變量中。方法手工遍歷法方法方法方法方法 淺拷貝和淺拷貝的問題,不僅在日常應(yīng)用中需要注意,而且在面試和筆試中也常被用來考察應(yīng)聘者,屬于文體兩開花的points。 什么是深拷貝和淺拷貝呢? 名稱 ...
閱讀 3771·2023-04-25 20:00
閱讀 3118·2021-09-22 15:09
閱讀 513·2021-08-25 09:40
閱讀 3424·2021-07-26 23:38
閱讀 2213·2019-08-30 15:53
閱讀 1101·2019-08-30 13:46
閱讀 2799·2019-08-29 16:44
閱讀 2052·2019-08-29 15:32