1. 程式人生 > >JS淺拷貝和深拷貝詳解

JS淺拷貝和深拷貝詳解

簡單的來說就是,在有指標的情況下,淺拷貝只是增加了一個指標指向已經存在的記憶體,而深拷貝就是增加一個指標並且申請一個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!
在js中,對於非基本型別資料(普通物件或陣列),淺拷貝只是拷貝了記憶體地址,子類屬性指向父類屬性的記憶體地址,而子類修改後父類也會被修改

看程式

<script type="text/javascript"> 
            var a={
	              name:'liu',
	              age:12,
	              address:{    //父物件的address屬性是另外兩個物件,而不是簡單資料型別
	              	home:'home1',
	              	school:'xiaoxue'
	              }
            }
            var b={
            	sex:'boy'
            }
            function extend(a,b){
            	for(var prop in a){
            		b[prop]=a[prop];
            	}
            	
            }
            extend(a,b);
            b.address.home='home2';
            console.log(a.address.home);
            console.log(b.address.home);
            
		</script>

程式中,父物件a的屬性沒有定義為基本資料型別(基本資料型別的定義都會開闢新的記憶體),而是又指向了另外兩個物件屬性,這時子類從父類裡拷貝的address屬性是address的記憶體地址,也就是說子類和父類指向同一個記憶體塊,改變了子類也就改變了父類。

解決這一問題,需要深拷貝

<script type="text/javascript">
			var a = {
				name: 'liu',
				age: 12,
				address: {
					home: 'home1',
					school: 'xiaoxue'
				}
			}
			var b = {
				sex: 'boy'
			}

			function extend(a, b) {
				for(var prop in a) {
					//判斷是否是基本資料型別
					if(typeof a[prop] === "object") {
						b[prop] = (a[prop].constructor === Array) ? [] : {};//物件和陣列區別處理
						extend(a[prop], b[prop]);
					} else {
						b[prop] = a[prop];
					}

				}

			}
			extend(a, b);
			b.address.home = 'home2';
			console.log(a.address.home);
			console.log(b.address.home);
		</script>

如此,子類拷貝父類而不改變父類,實現了所謂繼承。
當然深拷貝只是實現繼承的一種最基本的方式,還可以通過構造方法,使用call來進行繼承,或者直接用prototype原型鏈來實現繼承。

相關推薦

JS拷貝拷貝

簡單的來說就是,在有指標的情況下,淺拷貝只是增加了一個指標指向已經存在的記憶體,而深拷貝就是增加一個指標並且申請一個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候

JavaScript中拷貝拷貝,棧堆

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/weixin_40983119/article/details/82995151 簡單來說,JavaScript中單個等於號的賦值就是拷貝,但是呢這個這個賦值可以分為兩種,一種是賦的是資料,一種是賦

Python 中的拷貝拷貝

Python 中的淺拷貝與深拷貝詳解 轉載請註明出處:https://blog.csdn.net/jpch89/article/details/85028862 文章目錄 Python 中的淺拷貝與深拷貝詳解 1. 淺拷貝

拷貝拷貝

官方文件: A shallow copy constructs a new compound object and then (to the extent possible) inserts the

js 對象的拷貝拷貝

tex bject script cnblogs ons assign 對象 而已 obj //淺拷貝,拷貝內存塊,拷貝部門代碼不共存 var obj = { a : "a", b : "b", c : { text : "這是一個文本" } }

js實現拷貝拷貝

擴展運算 復制對象 數據類型 對象 return strong key stringify 循環 淺拷貝和深拷貝都只針對於像Object, Array這樣的復雜對象, 區別:淺拷貝只復制對象的第一層屬性、深拷貝可以對對象的屬性進行遞歸復制 如果數組元素是基本類型,就會拷貝一

js拷貝拷貝

資料準備: var o = { //基本資料型別 name:'hxj', //引用資料型別中的Object user:{ age:23, id:201 }, //引用資料型別中的Array friend:['

js最基礎的 拷貝 拷貝

image else typeof 14. img spa == console pre 1.淺拷貝 就是一個對象的 值類型的復制 var dog = { name : ‘小黃‘, // bark : function(){

JS中的拷貝拷貝

拷貝 結果 如果 string typeof aso clone return isarray //淺拷貝 var o1 = { a: 10, b: 20, c: 30 }; var o2 = o1; o2.a = 100; console.log(o1);

js物件的拷貝拷貝

物件複製分為深拷貝和淺拷貝。 淺拷貝只會將物件中的各個屬性依次複製,而不會遞迴複製,因為js儲存物件是存地址的,所以會造成複製物件和原物件指向同一記憶體地址。 淺拷貝的程式碼簡單實現: var

js拷貝拷貝

一.深拷貝、淺拷貝是什麼: 1.討論JS物件深拷貝、淺拷貝的前提: (1)只有物件裡巢狀物件的情況下,才會根據需求討論,我們要深拷貝還是淺拷貝 (2)比如下面這種物件 var obj1 = { name: 'ziwei', arr : [1,2,3] } (

js實現陣列拷貝拷貝

// 陣列的淺拷貝,可用concat、slice返回一個新陣列的特性來實現拷貝 var arr = ['old', 1, true, null, undefined]; var new_arr = arr.concat(); // 或者var new_ar

js中的拷貝拷貝

我們都知道,JavaScript中有兩種資料型別,基本資料型別和引用資料型別。 對於js中的基本資料型別,如number、string、boolean等,我們都是按值訪問,因此淺拷貝是對其值的拷貝;對於引用型別,我們都是按引用訪問,即儲存在變數物件中的地址。通過該地址去訪問

JS中徹底弄懂拷貝拷貝

1、淺拷貝和深拷貝的簡介 淺拷貝:兩個物件經過拷貝後雖然具有相同的屬性,但是他們都指向同一個記憶體空間 let a = {x: 123} let b = a b.x = 234 console.log(b) // {x: 234} console.log(a) /

js 陣列的拷貝拷貝

1.背景介紹   javascript分原始型別與引用型別。Array是引用型別,直接用“=”號賦值的話,只是把源陣列的地址(或叫指標)賦值給目的陣列,指向的是同一個記憶體地址,其中一個改變另一個也會改變。並沒有實現陣列的資料的拷貝。這種方式的實現屬於淺拷貝。   深拷貝是開闢新的儲存空間,兩個物件對應兩個不

python中的拷貝拷貝

div blog deep imp class pri cnblogs 字符串 style 1.淺拷貝 copy.copy() 淺拷貝是拷貝只拷貝最外一層(這裏所說的拷貝是重新生成一個內存地址,也就是只有最外層的地址是重新生成) import copy li=[23,45

引用賦值,拷貝拷貝

lan art csdn 理解 article 淺拷貝和深拷貝 blank .net hang 三種引用: http://blog.csdn.net/XIAXIA__/article/details/41652057 深拷貝和淺拷貝的理解: http://blog.csdn

【轉】python的拷貝拷貝

end ont code append pen ron 實例 賦值 深拷貝 直接賦值:其實就是對象的引用(別名)。 淺拷貝(copy):拷貝父對象,不會拷貝對象的內部的子對象。 深拷貝(deepcopy): copy 模塊的 deepcopy 方法,完全拷貝了父對象及其

java拷貝拷貝

一起 head 有著 cloneabl 獨立 head對象 影響 如果 覆蓋 轉:http://blog.csdn.net/u014727260/article/details/55003402 實現clone的2點: 1,clone方法是Object類的一個方法

JavaScript中的拷貝拷貝

ons == 進行 新建 手動 一個 var javascrip 空間 淺拷貝:拷貝引用。 拷貝後的新對象和源對象都是指向同一個引用地址,因此彼此之間操作互相影響。 let a = {num:1}; let b = a; console.log(a===b); //true