博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深浅拷贝数组
阅读量:5811 次
发布时间:2019-06-18

本文共 2658 字,大约阅读时间需要 8 分钟。

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()复制代码

转载于:https://juejin.im/post/5c7e6b7ef265da2dd6391954

你可能感兴趣的文章
10g手动创建数据库
查看>>
Windwos Server 2008 R2 DHCP服务
查看>>
UVa 11292 勇者斗恶龙(The Dragon of Loowater)
查看>>
白话算法(7) 生成全排列的几种思路(二) 康托展开
查看>>
d3 v4实现饼状图,折线标注
查看>>
微软的云策略
查看>>
Valid Parentheses
查看>>
【ES6】数值的扩展
查看>>
性能测试之稳定性测试
查看>>
ES6的 Iterator 遍历器
查看>>
2019届高二(下)半期考试题(文科)
查看>>
nginx 301跳转到带www域名方法rewrite(转)
查看>>
AIX 配置vncserver
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
network
查看>>
SettingsNotePad++
查看>>
centos7安装cacti-1.0
查看>>
3个概念,入门 Vue 组件开发
查看>>
没有JS的前端:体积更小、速度更快!
查看>>