陣列深拷貝 JS的賦值與深淺拷貝例項

2021-10-14 21:56:09 字數 3802 閱讀 7704

//基本資料型別賦值

var a = 10;

var b = a;

a++ ;

console.log(a); // 11

console.log(b); // 10

//引用資料型別賦值

let a =

let b = a

b.name = '22'

console.log(a.name) // 22

console.log(b.name) // 22

注意:淺拷貝只複製一層物件的屬性

方法一:object.assign

*語法:object.assign(target, ...sources) *

es6中拷貝物件的方法,接受的第乙個引數target是拷貝後的物件,剩下的引數是要拷貝的物件sources(可以是多個)

例1:

let target = {};

let source = };

object.assign(target ,source);

console.log(target); // }

例2:

let target = {};

let source = };

object.assign(target ,source);

source.a = '22';

source.b.name = 'nana'

console.log(source); // }

console.log(target); // }

object.assign注意事項

只拷貝源物件的自身屬性(不拷貝繼承屬性)

它不會拷貝物件不可列舉的屬性

undefinednull無法轉成物件,它們不能作為object.assign引數,但是可以作為源物件

屬性名為symbol值的屬性,可以被object.assign拷貝。

方法二:array.prototype.slice

實現原陣列的淺拷貝

var a = [ 1, 3, 5,  ];

var b = array.prototype.slice.call(a);

b[0] = 2;

console.log(a); // [ 1, 3, 5, ];

console.log(b); // [ 2, 3, 5, ];

// 從輸出結果可以看出,淺拷貝後,陣列a[0]並不會隨著b[0]改變而改變

// 說明a和b在棧記憶體中引用位址並不相同。

var a = [ 1, 3, 5,  ];

var b = array.prototype.slice.call(a);

b[3].x = 2;

console.log(a); // [ 1, 3, 5, ];

console.log(b); // [ 1, 3, 5, ];

// 從輸出結果可以看出,淺拷貝後,陣列中物件的屬性會根據修改而改變

// 說明淺拷貝的時候拷貝的已存在物件的物件的屬性引用。

方法三:array.prototype.concat

let array = [, ];

let array1 = [,];

let array2=array.concat(array1);

array1[0].c=123;

console.log(array2);// [ , , , ]

console.log(array1);// [ , ]

方法四:...擴充套件運算子

語法:var cloneobj = ;

var a = [ 1, 3, 5,  ];

var b = ;

b[0] = 2;

console.log(a); // [ 1, 3, 5, ];

console.log(b); // [ 2, 3, 5, ];

// 從輸出結果可以看出,淺拷貝後,陣列a[0]並不會隨著b[0]改變而改變

// 說明a和b在棧記憶體中引用位址並不相同。

var a = [ 1, 3, 5,  ];

var b = ;

b[3].x = 2;

console.log(a); // [ 1, 3, 5, ];

console.log(b); // [ 1, 3, 5, ];

// 從輸出結果可以看出,淺拷貝後,陣列中物件的屬性會根據修改而改變

// 說明淺拷貝的時候拷貝的已存在物件的物件的屬性引用。

其他方法:

//淺拷貝實現

var obj = ;

var shallowobj = shallowcopy(obj);

function shallowcopy(src) ;

for (var prop in src)

} return dst;

}shallowobj.arr[1] = 5;

obj.arr[1] // = 5

深拷貝開闢乙個新的棧,兩個物件對應兩個不同的位址,修改乙個物件的屬性,不會改變另乙個物件的屬性注意:深拷貝對物件中的子物件進行遞迴拷貝,拷貝前後兩個物件互不影響

方法一:json.parse(json.stringify())

let arr = [1, 2, ];

let newarr = json.parse(json.stringify(arr));

newarr[2].name = 'nana';

console.log(newarr); // [ 1, 2, ]

console.log(arr); // [ 1, 2, ]

json.stringify()實現深拷貝注意點

拷貝的物件的值中如果有函式,undefined,symbol則經過json.stringify()序列化後的json字串中這個鍵值對會消失

無法拷貝不可列舉的屬性,無法拷貝物件的原型鏈

拷貝date引用型別會變成字串

拷貝regexp引用型別會變成空物件

物件中含有nan、infinity和-infinity,則序列化的結果會變成null

無法拷貝物件的迴圈應用(即obj[key] = obj)

方法二:jquery 的 $.extend

var $ = require('jquery');

var obj1 = },

c: [1, 2, 3]

};var obj2 = $.extend(true, {}, obj1);

淺拷貝和**拷貝區別淺拷貝只複製一層物件的屬性,而深拷貝則遞迴複製了所有層級

賦值與深淺拷貝

a 1 b a a 2 print a a print b b 列印出結果 a 2 b 1 解析 當a 1的時候,記憶體中開闢兩個空間,乙個空間存放數字1,乙個空間存放數字1的實體地址0x52446c40,當b a的時候,是將a的值賦予b,記憶體中會開闢另乙個空間也是存放數字1的實體地址0x5244...

JS賦值 淺拷貝和深拷貝

賦值 當我們把乙個物件賦值給乙個新的變數時,賦的其實是該物件在棧中的位址,而不是堆中的資料。也就是兩個物件指向同乙個內儲存空間,無論哪個物件發生改變,其實都是改變儲存空間的內容,因此兩個物件是聯動的 var person console.log person var person1 person p...

python賦值與深淺拷貝

參考文章 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 a 1 2,3 hello python c b a for i in range len a print id a i id b i all true print a b true這種情況下,b和a是一樣的,他們指向同...