深拷貝複製變量值,對於非基本類型的變量,則遞歸至基本類型變量後,再複製。 深拷貝後的對象與原來的對象是徹底隔離的,互不影響,對一個對象的修改並不會影響另外一個對象。javascript
淺拷貝是會將對象的每一個屬性進行依次複製,可是當對象的屬性值是引用類型時,實質複製的是其引用,當引用指向的值改變時也會跟着變化。java
淺拷貝和深拷貝都只針對於引用數據類型。數組
let obj = {
name: 'Yvette',
age: 18,
hobbies: ['reading', 'photography']
}
let obj1 = obj
let obj2 = Object.assign({}, obj)
let obj3 = JSON.parse(JSON.stringify(obj))
obj.name = 'Jack'
obj.hobbies.push('coding')
console.log(obj) //{ name: 'Jack', age: 18,hobbies: [ 'reading', 'photography', 'coding' ] }
console.log(obj1) //{ name: 'Jack', age: 18,hobbies: [ 'reading', 'photography', 'coding' ] }
console.log(obj2) //{ name: 'Yvette', age: 18,hobbies: [ 'reading', 'photography', 'coding' ] }
console.log(obj3) //{ name: 'Yvette', age: 18,hobbies: [ 'reading', 'photography' ] }
複製代碼
從以上例子能夠看出,當數據爲引用數據類型時函數
function deepClone(obj, hash = new WeakMap()) {
//遞歸拷貝
if (obj instanceof RegExp) return new RegExp(obj)
if (obj instanceof Date) return new Date(obj)
if (obj === null || typeof obj !== 'object') {
//若是不是複雜數據類型,直接返回
return obj
}
if (hash.has(obj)) {
return hash.get(obj)
}
/** * 若是obj是數組,那麼 obj.constructor 是 [Function: Array] * 若是obj是對象,那麼 obj.constructor 是 [Function: Object] */
let t = new obj.constructor()
hash.set(obj, t)
for (let key in obj) {
//遞歸
if (obj.hasOwnProperty(key)) {
//是不是自身的屬性
t[key] = deepClone(obj[key], hash)
}
}
return t
}
複製代碼
JavaScriptui