JS對(duì)象復(fù)制(深拷貝和淺拷貝)
一、淺拷貝
1、Object.assign(target,source,source...)
a、可支持多個(gè)對(duì)象復(fù)制
b、如果source和target屬性相同 source會(huì)復(fù)制target的屬性
c、target只能為Object對(duì)象
var obj = {a:1,b:2}
undefined
Object.assign({c:3},obj)
{c: 3, a: 1, b: 2}
obj
{a: 1, b: 2}
兼容性寫法if(Object.assign){//兼容}else{//不兼容}
2、擴(kuò)展運(yùn)算符(spread)
支持將多個(gè)對(duì)象復(fù)制到一個(gè)對(duì)象上“
var obj1 = { foo: "foo" };
var obj2 = { bar: "bar" };
var copySpread = { ...obj1, ...obj2 }; // Object {foo: "foo", bar: "bar"}
copySpread
{foo: "foo", bar: "bar"}
var obj = {a:1,b:2,c:3}
var objs = {...obj}
objs
{a: 1, b: 2, c: 3}
objs.a=10
10
objs
{a: 10, b: 2, c: 3}
obj
{a: 1, b: 2, c: 3}
二、深拷貝
1、使用對(duì)象序列化 JSON.stringify()和JSON.parse()
注意:此方法僅在原對(duì)象包含可序列化值類型且沒有任何循環(huán)引用時(shí)才有效。不可序列化值類型的一個(gè)例子是Date對(duì)象 -JSON.parse只能將其解析為字符串而無法解析回其原始的Date對(duì)象 或者對(duì)象中屬性值為function
var obj = {a:1,b:[1,2,3],c:{e:3},bool:false}
undefined
var objs = JSON.parse(JSON.stringify(obj))
undefined
objs
{a: 1, b: Array(3), c: {…}, bool: false}
objs.bool = true
true
objs
{a: 1, b: Array(3), c: {…}, bool: true}
obj
{a: 1, b: Array(3), c: {…}, bool: false}
2、使用遞歸,對(duì)對(duì)象屬性進(jìn)行判斷
function deepClone(obj) {
var copy;
// 如果 obj 是 null、undefined 或 不是對(duì)象,直接返回 obj
// Handle the 3 simple types, and null or undefined
if (null == obj || "object" != typeof obj) return obj;
// Handle Date
if (obj instanceof Date) {
copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// Handle Array
if (obj instanceof Array) {
copy = [];
for (var i = 0, len = obj.length; i < len; i++) {
copy[i] = clone(obj[i]);
}
return copy;
}
// Handle Function
if (obj instanceof Function) {
copy = function() {
return obj.apply(this, arguments);
}
return copy;
}
// Handle Object
if (obj instanceof Object) {
copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
}
return copy;
}
throw new Error("Unable to copy obj as type isn't supported " + obj.constructor.name);
}
以上就是JS對(duì)象復(fù)制(深拷貝和淺拷貝)的詳細(xì)內(nèi)容,更多關(guān)于JS的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript獲取當(dāng)前頁面url參數(shù)的方法詳解
這篇文章主要為大家詳細(xì)介紹了前端獲取當(dāng)前頁面url參數(shù)的一些常見方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
JavaScript學(xué)習(xí)筆記之惰性函數(shù)示例詳解
函數(shù)是js世界的一等公民,js的動(dòng)態(tài)性、易變性在函數(shù)的應(yīng)用上,體現(xiàn)的淋漓盡致。下面這篇文章主要給大家介紹了關(guān)于JavaScript學(xué)習(xí)筆記之惰性函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-08-08
javascript實(shí)現(xiàn)視頻彈幕效果(兩個(gè)版本)
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)視頻彈幕效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
JavaScript中繼承的七種方式對(duì)比總結(jié)
這篇文章小編就來和大家盤點(diǎn)一下JS里實(shí)現(xiàn)繼承的七種方式,從最基礎(chǔ)的到最完善的,讓你在面試官問JS繼承有哪些方式時(shí),能從容應(yīng)對(duì),還能說出各自的優(yōu)缺點(diǎn)2026-03-03
javascript 客戶端驗(yàn)證上傳圖片的大?。嫒軮E和火狐)
做web開發(fā)的哥們都會(huì)遇到批量上傳圖片的需求,相信大家都會(huì)遇到這樣的問題,當(dāng)選擇好要上傳的圖片,提交服務(wù)器后,發(fā)現(xiàn)有圖片的大小超過了系統(tǒng)允許的范圍。2009-08-08
JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名效果,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11

