javascript 淺拷貝和深拷貝

2021-07-29 17:56:44 字數 2056 閱讀 2355

簡單的賦值就是淺拷貝。因為物件和陣列在賦值的時候都是引用傳遞。賦值的時候只是傳遞乙個指標。

看下面的例項**:

var a = [1,2,3];

var b =a ;

var test = ;

var c = test;

console.log(a);

console.log(b);

console.log(test);

console.log('-------------------');

b[0] =5;

c.age = 16;

console.log(a);

console.log(b);

console.log(test);

console.log(c);

結果如下: 

淺拷貝很容易,但是很多時候我們需要原樣的把陣列或者物件複製乙份,在修改值的時候,不改變初始物件的值。這個時候就需要使用深拷貝。

因為物件相對較為複雜,所以我們先來看對陣列的深拷貝的問題。

陣列的深拷貝

function deepcopy(arr)

}function childtest()

}childtest.prototype=new test();

var children=new childtest();

// children.sing();

/*for(var key in children)*/

/*當我們使用for …in 遍歷乙個物件的時候他會向上查詢原型鏈上得屬性*/

for(var key in children)

}

完整的clone乙個物件的方法:

var cloneobject ={};

for (var key in children)

}

使用jquery進行物件的複製

jquery

.extend( [ deep ], target , object1

[, objectn... ] )

請根據前面語法部分所定義的引數名稱查詢對應的引數。

引數描述

deep

可選/boolean型別指示是否深度合併物件,預設為false。如果該值為true,且多個物件的某個同名屬性也都是物件,則該」屬性物件」的屬性也將進行合併。 

target

object型別目標物件,其他物件的成員屬性將被複製到該物件上。 object1 可選/object型別第乙個被合併的物件。 

objectn

可選/object型別第n個被合併的物件。

可以知道,jquery中extend()不是複製引用,而是建立了新的物件

看下面一段**對陣列物件進行拷貝:

var test = [1,2,34,];

console.log(test);

var contest= $.extend(,test);

console.log(contest);

contest.push(567);

console.log(test);

console.log(contest);

結果為:

JavaScript深拷貝和淺拷貝

我們在專案開發過程中經常會拿到乙個資料後需要拷貝乙份副本出來進行操作,而且會發現在很多前端框架中都是拷貝乙份操作的,那麼這就涉及到了 js 中對資料的深淺拷貝問題,所謂深淺拷貝,淺拷貝的意思就是,你只是複製了物件資料的引用,並沒有把記憶體裡的值另外複製乙份,那麼深拷貝就是把值完整地複製乙份新的值。那...

JavaScript深拷貝 淺拷貝

淺拷貝 淺拷貝只是複製了記憶體位址,如果原位址中的物件改變了,淺拷貝出來的物件也會相應改變。深拷貝 開闢了一塊新的記憶體存放位址和位址指向的物件,原位址的任何物件改變了,深拷貝出來的物件不變。淺拷貝陣列 只拷貝第一級陣列 1.直接遍歷var arr 1,2,3,4 function copy arg...

javaScript淺拷貝 深拷貝

資料型別 js的資料型別有兩種 1.基本資料型別 數值 字串 布林 null undefined 值型別 存放在棧中,所以複製基本資料型別的值是會新開乙個棧記憶體 淺拷貝 如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。深拷貝 深度拷貝就是把...