3019/03/05
深拷贝,简单的使用便是用 被封装好的,可以直接用于深拷贝的方法有:
... 扩展运算符JSON.parse(JSON.stringify(source)) 复制代码
但是用js代码去实现呢?
首先就是会想到遍历,去遍历数组,或者是对象。
想到遍历就会想到for 循环。
for ... of 或者 for ... in 都可以实现,区别是 for ... of 可以由 break, throw 或return终止
首先使用 for of
const deepClone = obj => { const newObj = (Array.isArray(obj) ? [] : {}) // 判断是不是数组 for (const [k,v] of Object.entries(obj)) { // 将数组或者对象变为具有键值对的数组 //newObj[k] = v // 浅拷贝 将对象属性里面的值赋值给新对象 newObj[K] = (typeof v === 'object') ? deepClone(v) : v //深拷贝 (如果对象/数组里面的值还是对象,则递归,再进行克隆) } return newObj } // 数组 let arr = [1,2,3] //test1 let arr2 = deepClone(arr); console.log(arr2,arr) // [1,2,3] [1,2,3] //test2 let arr3 = deepClone(arr); arr3[1] = 10; console.log(arr3,arr) // [1,2,3] [1,2,3] //对象 let people = { name: { firstName: 'wang', lastName: 'huihui' } } let someone = deepClone(people) someone.name.lastName = 'test' console.log(ArrObject2, ArrayOnject) // {name: {firstName: 'wang', lastName: 'huihui'} } {name: {firstName: 'wang', lastName: 'test'} } 复制代码
使用 for in (Object.prototype.hasOwnProperty.call() 方法)
const deepClone = obj => { const newObj = (Array.isArray(obj) ? [] : {}) for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { // 判断obj对象得原型链里面是否有key属性 newObj[key] = (typeof obj[key] === 'object') ? deepClone(obj[key]) : obj[key] /// 如果对象里面的属性还是一个对象,则递归继续拷贝,将对象里面属性的值赋值给新的属性 } } return newObj } // 数组 let arr = [1,2,3] //test1 let arr2 = deepClone(arr); console.log(arr2,arr) // [1,2,3] [1,2,3] //test2 let arr3 = deepClone(arr); arr3[1] = 10; console.log(arr3,arr) // [1,2,3] [1,2,3] //对象 let people = { name: { firstName: 'wang', lastName: 'huihui' } } let someone = deepClone(people) someone.name.lastName = 'test' someone.name[lastName] = 'test' // 两个式子是一样的 console.log(ArrObject2, ArrayOnject) // {name: {firstName: 'wang', lastName: 'huihui'} } {name: {firstName: 'wang', lastName: 'test'} } 复制代码
方法介绍:
Object.prototype.hasOwnProperty.call() 会返回一个==布尔值==去判断对象自身属性中是否具有指定的属性 (重点查看 MDN)
Object.entries()返回一个给定对象自身可枚举属性的==键值对数组==,其排列顺序是于for..in 循环遍历改对象返回的顺序是一致的(for in 也枚举原型链中的属性)
为了简便,最好能使用三元运算符去节省一定的代码!!!!!
则简单的浅拷贝:
///浅拷贝一个对象,或者数组 copyObject = (oldObj) => { const newObj = {} // [] for (let k in oldObj) { newObj[k] = oldObj[k] } } 或者使用 OBject.assign()复制代码