面试题十三:什么是深拷贝?拷贝哪些方式?如何实现深拷贝?
七娃博客638人阅读
什么是深拷贝?
深拷贝对应的是浅拷贝,浅拷贝就是字面上的,例如B拷贝A,就是将A的内容复制给B,如果B发生变化,那么A也跟着改变,这就算是浅拷贝!所以深拷贝和浅拷贝的区别就在于拷贝后的数据是否影响复制源!
浅拷贝:修改拷贝后的数据会影响源数据
深拷贝:修改拷贝后的数据不会影响源数据
直接赋值是浅拷贝,以下就不多说了,一个“=”拷贝内容;下面总结一些其他拷贝数组和对象的方法!
一.数组拷贝方法都有哪些?
1.slice() 不带任何参数的时候,默认返回一个长度和原数组相同的新数组
let a = [1,2,3,5] let b = a.slice();
2.concat() 链接一个新数组,相当于concat([])
let c = a.concat();
3.手写
function copy(obj){ var newO = {}; for(let keys in obj){ newO[keys] = obj[keys] } return newO; }
二、对象拷贝方法都有哪些?
1.{...obj} ES6扩展运算符,解析解构法
let aa = { name:'七娃', sex:'男' } let bb = {...aa}
2.Object.assign(new,old1,old2) ES6 合并为对象
let cc = Object.assign({},aa)
3.手写函数
function copy(obj){ var newO = {}; for(let keys in obj){ newO[keys] = obj[keys] } return newO; }
以上拷贝方法均属于 浅拷贝 的方法,那么为保证改变拷贝后的对象不影响 源对象,如何实现深拷贝?
深拷贝的方法有哪些?
1.JSON格式转换法
function deepCopy(obj){ return JSON.parse(JSON.stringify(obj)); }
2.手写深拷贝
function deepCopy(obj){ var newObj = Array.isArray(obj)?[]:{} for(let keys in obj){ if(obj.hasOwnProperty(keys)){ newObj[keys] = typeof obj[keys]==='object' ? deepCopy(obj[keys]) : obj[keys] } } return newObj; }
无论深拷贝还是浅拷贝,考验的都是对数组和对象的操作和递归!
[…] Object.assign()什么意思?Object.assign有什么用?Object.assign如何实现深拷贝?很多新手对于这个方法了解甚少,之前一直不去研究面试题和js的基础,根本不知道有这个方法,在实现深拷贝的时候会用到这个,那么今天就来总结一些关于Object.assign的常见知识点。 […]
[…] 最近学习研究面试题,发现很多函数(深拷贝,数组乱序,节流防抖….)里面都有arguments这个对象参数,最开始百度了一下,是一个对应于传递给函数的参数的类数组对象,然后就绕过了TA… […]