摘要:淺拷貝深拷貝淺拷貝的問題如果父對象的屬性等于數組或另一個對象,那么實際上,子對象獲得的只是一個內存地址,而不是真正拷貝,因此存在父對象被篡改的可能。
淺拷貝:
function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c; }
深拷貝:
function deepCopy(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] === "object") { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c; }
淺拷貝的問題:如果父對象的屬性等于數組或另一個對象,那么實際上,子對象獲得的只是一個內存地址,而不是真正拷貝,因此存在父對象被篡改的可能。
下面來個實例:
var obj1 = { name:"helloJack", inner:{ sum:5 } }; var obj2 = extendCopy(obj1,{}); obj2.name ="sss"; obj2.inner.sum = 7; console.log(obj1.name); //helloJack console.log(obj1.inner.sum); //5
存在的問題,如果經常改寫這個函數的方法extendCopy,內部再調用這個方法名就會出錯,還得修改一下這個方法名,那么下面這樣解決:
var extendCopy = (function f(p,c){ var c = c || {}; for (var i in p) { if(typeof p[i] === "object"){ c[i] = (p[i] instanceof Array) ? [] : {}; f(p[i],c[i]); }else{ c[i] = p[i]; } } return c; });
可參考地址:
小tips:JS嚴格模式(use strict)下不能使用arguments.callee的替代方案
Javascript 面向對象編程(一):封裝
Javascript面向對象編程(二):構造函數的繼承
Javascript面向對象編程(三):非構造函數的繼承
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89773.html
摘要:判斷是深拷貝對象還是數組如果要拷貝的對象的屬性依然是個復合類型,遞歸運用遞歸,當要拷貝的對象或者數組的屬性依然是個對象或者數組時,遞歸調用。遍歷對象聊完了深拷貝和淺拷貝,接下來說一下遍歷。 在js這門語言中,數據存放在堆中,而數據的引用的存放在棧中。 淺拷貝 我們說的淺拷貝,指的是,引用地址的拷貝,棧中兩塊不同的引用地址都指向了堆中同樣一塊區域。所以,我們通過一個地址修改了堆中的數據,...
摘要:淺拷貝與深拷貝一數據類型數據分為基本數據類型,和對象數據類型。淺拷貝是按位拷貝對象,它會創建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝。對于字符串數字及布爾值來說不是或者對象,會拷貝這些值到新的數組里。 淺拷貝與深拷貝 一、數據類型數據分為基本數據類型(String, Number, Boolean, Null, Undefined,Symbol)和對象數據類型。 基本數據類...
摘要:定義淺復制如果復制引用,復制后的引用都是指向同一個對象的實例,彼此之間的操作會互相影響。淺復制數組淺復制利用數組方法和返回新數組特性,進行復制。深復制對象深復制利用對象的和方法。 定義 淺復制 如果復制引用,復制后的引用都是指向同一個對象的實例,彼此之間的操作會互相影響。 深復制 深復制不是簡單的復制引用,而是在堆中重新分配內存,并且把源對象實例的所有屬性都進行新建復制,以保證深復制的...
閱讀 2076·2023-04-25 19:03
閱讀 1221·2021-10-14 09:42
閱讀 3399·2021-09-22 15:16
閱讀 946·2021-09-10 10:51
閱讀 1545·2021-09-06 15:00
閱讀 2401·2019-08-30 15:55
閱讀 485·2019-08-29 16:22
閱讀 893·2019-08-26 13:49