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