摘要:深拷貝和淺拷貝問題的本質還是不同數據類型的存儲方式差異,尤其是引用數據類型的特殊。
深拷貝和淺拷貝問題的本質還是不同數據類型的存儲方式差異,尤其是引用數據類型的特殊。
現分別對賦值、淺拷貝、深拷貝做深入研究:
1.賦值原理:直接將對象指針直接賦值給另一個變量
代碼:
let developer = { title: "Frontend", basic: { html: "5", css: "3", js: "es6" }, frameworks: ["React", "Vue", "AngularJS"], summary: function(){ console.log("I am FE developer"); } }; let newDeveloper = developer; console.log(newDeveloper); //基本類型:改變原對象 newDeveloper.title = "Frontend Leader"; console.log(developer.title); // Frontend Leader //對象:改變原對象 newDeveloper.basic.http = "2.0"; console.log(developer.basic.http); // 2.0 newDeveloper.basic.js = "es5"; console.log(developer.basic.js); // es5 //數組:改變原對象 newDeveloper.frameworks.push("Angular"); console.log(developer.frameworks); // [ "React", "Vue", "AngularJS", "Angular" ] //函數:改變原對象 newDeveloper.summary = function () { console.log("I like FE development"); }; developer.summary(); // I like FE development2.淺拷貝
原理:遍歷對象的每個屬性進行逐個拷貝
實現方式:
方式1:遍歷并復制
方式2:Object.assign()
代碼:
let developer = { title: "Frontend", basic: { html: "5", css: "3", js: "es6" }, frameworks: ["React", "Vue", "AngularJS"], summary: function(){ console.log("I am FE developer"); } }; /* * 方式1:逐個復制 * * */ function cloneInShallow(source) { let target = {}; for (prop in source){ target[prop] = source[prop]; } return target } let newDeveloper = cloneInShallow(developer); /* * 方式2:Object.assign() * * */ // let newDeveloper = Object.assign({}, developer); console.log(newDeveloper); //基本類型:不改變原對象 newDeveloper.title = "Frontend Leader"; console.log(developer.title); // Frontend // 對象:改變原對象 newDeveloper.basic.http = "2.0"; console.log(developer.basic.http); // 2.0 newDeveloper.basic.js = "es5"; console.log(developer.basic.js); // es5 //數組:改變原對象 newDeveloper.frameworks.push("Angular"); console.log(developer.frameworks); // [ "React", "Vue", "AngularJS", "Angular" ] //函數:不改變原對象 newDeveloper.summary = function () { console.log("I like FE development"); }; developer.summary(); // I am FE developer3.深拷貝
原理:使用遞歸,遍歷每一個對象屬性進行拷貝
實現方式:
方式1: 純手工打造回調函數
方式2: JSON.parse(JSON.stringify(obj))
方式3: 借助jQuery
方式4: 借助lodash
代碼:
let developer = { title: "Frontend", basic: { html: "5", css: "3", js: "es6" }, frameworks: ["React", "Vue", "AngularJS", {node: "express"}], summary: function(){ console.log("I am FE developer"); } }; /* * 方式1: 純手工打造 * */ function cloneInDeep(source) { if(source && typeof source === "object"){ let target = {}; for (let prop in source){ let value = source[prop]; if(Array.isArray(value)){ let newArray = []; value.forEach(function (item, index) { if(Array.isArray(item) || Object.getPrototypeOf(item) === Object.prototype){ newArray.push(cloneInDeep(item)) }else{ newArray.push(item) } }); target[prop] = newArray; }else if(Object.getPrototypeOf(value) === Object.prototype){ target[prop] = cloneInDeep(value); }else{ target[prop] = value; } } return target }else{ throw new Error("source is not object!") } } let newDeveloper = cloneInDeep(developer); /* * 方式2: JSON.parse(JSON.stringify(obj)) * 弊端:會拋棄對象的constructor * 適用:能夠被json直接表示的數據結構,對象中只包含number、string、boolean、array、扁平對象 * 不適用:含有function、regexp * */ // let newDeveloper = JSON.parse(JSON.stringify(developer)); /* * 方式3: jQuery * */ let $ = require("jquery"); // let newDeveloper = $.extend({}, developer); /* * 方式4: lodash * */ let _ = require("lodash"); // let newDeveloper = _.cloneDeep(developer); console.log(newDeveloper); //基本類型:不改變原對象 newDeveloper.title = "Frontend Leader"; console.log(developer.title); // Frontend // 對象:不改變原對象 newDeveloper.basic.http = "2.0"; console.log(developer.basic.http); // undefined newDeveloper.basic.js = "es5"; console.log(developer.basic.js); // es6 //數組:不改變原對象 newDeveloper.frameworks.push("Angular"); console.log(developer.frameworks); // [ "React", "Vue", "AngularJS" , { node: "express" } ] newDeveloper.frameworks[3].node = "koa"; console.log(developer.frameworks); // [ "React", "Vue", "AngularJS" , { node: "express" } ] //函數:不改變原對象 newDeveloper.summary = function () { console.log("I like FE development"); }; developer.summary(); // I am FE developer涉及的知識點:
數據類型及存儲機制
for...in...遍歷,枚舉屬性
遞歸
對象和數組的判斷
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95365.html
摘要:相信人很多學習的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區別我就不再贅述了,今天我來寫一下我自己實現深拷貝的各種方法。中的深拷貝也是用類似方法實現。 相信人很多學習js的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區別我就不再贅述了,今天我來寫一下我自己實現深拷貝的各種方法。 比較簡單的拷貝方式可以借用瀏覽器的Json對象去實現,先把對象轉化為json字符串,在解析回對...
摘要:本文解釋中深拷貝和淺拷貝的區別。深拷貝深拷貝指遞歸的復制對象的屬性給新對象。有些時候一層的深拷貝被認為是淺拷貝,比如的值是一個對象,淺拷貝出來的新對象直接引用了原對象的對象,所以也會相互影響的。 本文解釋javascript中深拷貝和淺拷貝的區別。 淺拷貝/Shallow Copy 淺拷貝指拷貝了引用值。 var original = {prop1 : Prop1, prop2 : p...
摘要:接下來我們進入正片數據類型六種基本數據類型布爾值,和一個表明值的特殊關鍵字。一種數據類型,它的實例是唯一且不可改變的。在中是沒有方法是可以改變布爾值和數字的。參考資料深拷貝淺拷貝 前言 筆者最近整理了一些前端技術文章,如果有興趣可以參考這里:muwoo blogs。接下來我們進入正片: js 數據類型 六種 基本數據類型: Boolean. 布爾值,true 和 false. nu...
摘要:接下來我們進入正片數據類型六種基本數據類型布爾值,和一個表明值的特殊關鍵字。一種數據類型,它的實例是唯一且不可改變的。在中是沒有方法是可以改變布爾值和數字的。參考資料深拷貝淺拷貝 前言 筆者最近整理了一些前端技術文章,如果有興趣可以參考這里:muwoo blogs。接下來我們進入正片: js 數據類型 六種 基本數據類型: Boolean. 布爾值,true 和 false. nu...
閱讀 3344·2021-11-10 11:36
閱讀 3244·2021-10-08 10:21
閱讀 2841·2021-09-29 09:35
閱讀 2416·2021-09-22 16:06
閱讀 3959·2021-09-09 09:33
閱讀 1327·2019-08-30 15:44
閱讀 3171·2019-08-30 10:59
閱讀 2982·2019-08-29 15:32