直接上**是我的風格基本資料型別的賦值
var a = 10;
var b = a;
b = 24;
console.log(a); // 10 a不受b的影響。
console.log(b) // 24
// 基本資料型別賦值時。。是copy乙份10的值。
// 當b=24時。a不受b的影響。
複製**
複雜資料型別的賦值
var obj =
var obj1 = obj;
obj1.age = 18;
console.log(obj); //
console.log(obj1); //
// 複雜資料型別賦值時。。是copy乙份引用位址如0x1111。
// 當obj1 = obj;時。obj和obj1引用一樣。指向同一片堆記憶體空間。
// 所以當obj1.age = 18時。同樣也會更改obj2。
複製**
注意: 淺拷貝和深拷貝都主要針對複雜資料型別
淺拷貝:淺拷貝只複製指向某個物件的指標,而不複製物件本身,新舊物件還是共享同一塊記憶體。
深拷貝:但深拷貝會另外創造乙個一模一樣的物件,新物件跟原物件不共享記憶體,修改新物件不會改到原物件。
淺拷貝
// 直接上**吧
function
shallowcopy(oldobj) ;
for(var prop in oldobj)
}return newobj;
}// 淺拷貝
var obj1 =
var obj2 = shallowcopy(obj1);
obj2.a = 18;
obj2.b = ['二', '三', '四'];
obj2.c[0] = ['五', '六'];
console.log('obj1===',obj1)
console.log('obj2===',obj2)
// 如果物件只有一層。。深拷貝 和 淺拷貝一樣。
複製**
賦值
// 賦值
var obj1 =
var obj3 = obj1;
obj3.a = 18;
obj3.b = ['二', '三', '四'];
obj3.c[0] = ['五', '六'];
console.log('obj1===',obj1)
console.log('obj3===',obj3)
// 共享一片記憶體。所有值都會改變。
複製**
自己封裝
function
shallowcopy(oldobj) ;
for(var prop in oldobj)
}return newobj;
}複製**
使用object.assign()
var pj = };
var pj1 = object.assign({}, obj);
pj1.a.a = "wade";
console.log(pj.a.a); //wade
複製**
注意:當object只有一層的時候,是深拷貝
var pj = };
var pj1 = object.assign({}, obj);
pj1.a.a = "wade";
console.log(pj.a.a); //wade
複製**
陣列的淺拷貝
// 第一種
let arr = [1, 3, ];
let arr2=arr.concat();
arr2[2].username = '君';
console.log(arr[2].username); // 君
// 第二種
let arr = [1, 3, ];
let arr3 = arr.slice();
arr3[2].username = '君';
console.log(arr[2].username); // 君
// 一般很少用到陣列的拷貝。
// 陣列淺拷貝和物件是一樣的
複製**
原陣列的元素會按照下述規則拷貝:
json.parse(json.stringify())
var pj =
};var deeppj = json.parse(json.stringify(pj)); // 。。這種方式弊端在於無法拷貝方法。
複製**
自覺手動封裝了
function
deepcopy(oldobj) ;
}else
if(oldobjtype === 'array')else
for(let prop in oldobj) else
}return newobj;
}複製**
借用第三方庫 函式庫lodash
var _ = require('lodash');
var obj1 = },
c: [1, 2, 3]
};var obj2 = _.clonedeep(obj1);
console.log(obj1.b.f === obj2.b.f); // false
複製**
JS賦值 淺拷貝和深拷貝
賦值 當我們把乙個物件賦值給乙個新的變數時,賦的其實是該物件在棧中的位址,而不是堆中的資料。也就是兩個物件指向同乙個內儲存空間,無論哪個物件發生改變,其實都是改變儲存空間的內容,因此兩個物件是聯動的 var person console.log person var person1 person p...
淺拷貝 深拷貝和淺賦值 深賦值
include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...
深拷貝 淺拷貝 資料型別
1 不可變型別 包括數值 字串 元組 不可變指的是不能改變引用,只能放置乙個新的引用 2 可變型別 包括列表和字典 可變指的是當向列表或字典裡面增刪改時,引用沒有受到影響 進一步解釋可變與不可變,是指記憶體中的那塊內容 value 是否可以被改變。如果是不可變型別,在對物件本身操作的時候,必須在記憶...