摘要:遞歸實現(xiàn)對象深拷貝遞歸實現(xiàn)對象深拷貝是否存在如果不存在創(chuàng)建空對象判斷是否為引用數(shù)據(jù)類型剝離原型鏈的數(shù)據(jù)判斷是否為引用數(shù)據(jù)類型對象或數(shù)組輔助函數(shù)判定是否是對象深拷貝面的所有屬性值到對象里面拷貝對象目標對象如果是值類型,那么就直接拷貝賦值如果是
1.JavaScript遞歸實現(xiàn)對象深拷貝
JavaScript遞歸實現(xiàn)對象深拷貝
function deepClone(origin,target){ //target是否存在如果不存在創(chuàng)建空對象 let tar = target || {}, //判斷是否為引用數(shù)據(jù)類型 toStr = Object.prototype.toString, arrType="[object Array]"; for(let key in origin){ //剝離原型鏈的數(shù)據(jù) if(origin.hasOwnProperty(key)){ //判斷是否為引用數(shù)據(jù)類型 對象或數(shù)組 if(typeof(origin[key]) === "object" && origin[key] !== null){ if(toStr.call(origin[key]) === arrType ){ tar[key] = []; }else{ tar[key] = {}; } deepClone(origin[key],tar[key]); }else{ tar[key] = origin[key]; } } } return tar; }
2.
/** * 輔助函數(shù), 判定是否是對象 * @param obj * @returns {boolean} */ function isObj(obj) { return obj instanceof Object; } /** * 深拷貝fromObj面的所有屬性/值, 到toObj對象里面 * @param fromObj 拷貝對象 * @param toObj 目標對象 */ function deepCopyObj2NewObj(fromObj, toObj) { for (var key in fromObj) { if(fromObj.hasOwnProperty(key)){ var fromValue = fromObj[key]; // 如果是值類型,那么就直接拷貝賦值 if (!isObj(fromValue)) { toObj[key] = fromValue; } else { // 如果是引用類型,那么就再調(diào)用一次這個方法, // 去內(nèi)部拷貝這個對象的所有屬性 // fromValue是什么類型, 創(chuàng)建一個該類型的空對象 var tmpObj = new fromValue.constructor; // console.log(tmpObj); // debugger; deepCopyObj2NewObj(fromValue, tmpObj); toObj[key] = tmpObj; } } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104750.html
摘要:先來普及一下深拷貝和淺拷貝的區(qū)別淺拷貝就是簡單的復制,用等號即可完成這就完成了一個淺拷貝但是當修改對象的時候,我們發(fā)現(xiàn)對象的值也被改變了這是因為淺拷貝只復制了指向?qū)ο蟮闹羔槪屡f對象共用同一塊內(nèi)存,修改某一個對象的同時也會把另一個都一并修改 先來普及一下深拷貝和淺拷貝的區(qū)別淺拷貝:就是簡單的復制,用等號即可完成 let a = {a: 1} let b = a 這就完成了一個淺拷貝但是...
摘要:在中可以通過添加一個參數(shù)來實現(xiàn)遞歸,調(diào)用就可以實現(xiàn)一個深拷貝。利用序列化實現(xiàn)一個深拷貝 在JavaScript中,對于Object和Array這類引用類型值,當從一個變量向另一個變量復制引用類型值時,這個值的副本其實是一個指針,兩個變量指向同一個堆對象,改變其中一個變量,另一個也會受到影響。 這種拷貝分為兩種情況:拷貝引用和拷貝實例,也就是我們說的淺拷貝和深拷貝 淺拷貝(shallow...
摘要:前言里面淺拷貝和深拷貝是非常關(guān)鍵的知識點,今天就來通過本文清楚的了解深淺拷貝以及該如何實現(xiàn)這兩種拷貝方式。對象的拷貝又分為淺拷貝和深拷貝。印證了上述所說的對于所有的基本類型,簡單的賦值已經(jīng)是實現(xiàn)了深拷貝。 前言 JavaScript里面淺拷貝和深拷貝是非常關(guān)鍵的知識點,今天就來通過本文清楚的了解深淺拷貝以及該如何實現(xiàn)這兩種拷貝方式。 深淺拷貝的區(qū)別 拷貝:其實就是一個對象復制給另外...
摘要:相信人很多學習的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區(qū)別我就不再贅述了,今天我來寫一下我自己實現(xiàn)深拷貝的各種方法。中的深拷貝也是用類似方法實現(xiàn)。 相信人很多學習js的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區(qū)別我就不再贅述了,今天我來寫一下我自己實現(xiàn)深拷貝的各種方法。 比較簡單的拷貝方式可以借用瀏覽器的Json對象去實現(xiàn),先把對象轉(zhuǎn)化為json字符串,在解析回對...
摘要:原文地址基礎(chǔ)心法深淺拷貝歡迎。上面的代碼是最簡單的利用賦值操作符實現(xiàn)了一個淺拷貝,可以很清楚的看到,隨著和改變,和也隨著發(fā)生了變化。展開運算符結(jié)論實現(xiàn)的是對象第一層的深拷貝。 原文地址:JavaScript基礎(chǔ)心法——深淺拷貝 歡迎star。 如果有錯誤的地方歡迎指正。 淺拷貝和深拷貝都是對于JS中的引用類型而言的,淺拷貝就只是復制對象的引用,如果拷貝后的對象發(fā)生變化,原對象也會發(fā)生...
閱讀 3734·2021-11-24 09:39
閱讀 2615·2019-08-30 15:54
閱讀 1156·2019-08-30 13:01
閱讀 3434·2019-08-28 18:30
閱讀 1627·2019-08-26 17:44
閱讀 3596·2019-08-26 11:31
閱讀 2419·2019-08-26 10:40
閱讀 1246·2019-08-26 10:27