對象複製方法總結 | |||
---|---|---|---|
Object.assign | Object.creat() | jQuery.extend(object) | |
JSON.parse(JSON.stringfy()) | 循環遞歸方法 | 原型鏈繼承方法 |
深拷貝是拷貝儲存在棧中的對象,
而淺拷貝是從內存中拷貝,
數據大體可以分爲兩種數據類型,
一種是基本數據類型,數據結構不是很複雜,單獨可以存在內存中就可以,
另一種是複雜數據類型,也叫引用數據類型,放在棧中存儲的,例如數組和對象
引用類型數據存儲是首先在內存開闢一個空間,但內存當中不可以存儲這種複雜數據類型,
所以要把這種結構放到棧當中,棧相當於一個密碼箱,而鑰匙存在內存當中,這就構成了一個存儲關係,
淺拷貝就是把這份鑰匙複製了一份,但內存當中的數據並沒有複製,所以如果改變a相應b也會改變
而深拷貝則需要在棧中在生成一個密碼箱,生成一把新鑰匙(鑰匙2),這樣深拷貝的兩種數值不會相互影響,
也可以說沒有任何關係了
方法一:JSON.parse(JSON.stringify(obj));
但是這種簡單粗暴的方法有其侷限性。當值爲undefined、function、symbol 、有NaN、Infinity和-Infinity、RegExp、Error對象,時間對象,會在轉換過程中被忽略或者異常
JSON.parse(JSON.stringfy())注意事項
方法二、遞歸通用拷貝函數
function clone(obj){
let newObj = Array.isArray(obj) ? [] : {};
for(let key in obj){
let val = obj[key];
newObj[key] = typeof val == 'object'&& val !==null?clone(val):val;
// //clone(val)遞歸複製
//這裏也沒有判斷是否爲函數,因爲對於函數,我們將它和一般值一樣處理
}
return newObj ;
}
方法三、Object.assign({},obj)
var obj = {a:1,b:2}
var newObj = Object.assign({}, obj);
方法四、jq中,$.extend({},obj)方法、jQuery.extend(object)方法
概述:
擴展jQuery對象本身,用來在jQuery命名空間上增加新函數。
var obj = {
x: 1,
y: {
a: 1,
b: 0,
c: [1, 2, 3]
}
};
var obj2 = $.extend({}, obj);
console.log(obj2 === obj) //false
console.log(obj2);
方法五. Object.create()方法
複製對象存在於Object原型prototype中
var obj = {
x: 1,
y: {
a: 1,
b: 0,
c: [1, 2, 3]
}
};
var obj2 = Object.create(obj);
console.log(obj2 == obj); //false
console.log(obj2);
深拷貝, 就是遍歷那個被拷貝的對象。判斷對象裏每一項的數據類型。如果不是對象類型, 就直接賦值, 如果是對象類型, 就再次調用遞歸的方法去賦值。
方法六. 原型鏈繼承方法
function Father() {
this.say = "hi";
this.fn = function () {
return this.say;
}
}
Father.prototype.eat = function () {
console.log('喫');
}
function Son() {
this.play = function () {
console.log('play game');
}
}
//通過原型來繼承父類的公共屬性
Son.prototype = new Father();
var s = new Son();
console.log(s);
console.log(s.say); //hi
console.log(s.fn()); //hi