前端笔试题3:js实现深浅拷贝
一、理解堆和栈
- 栈:用于存放函数的 参数值、局部变量 等
- 堆:用于存放 对象
var a = 123 //栈
var obj = {} //堆
二、什么是深浅拷贝
浅拷贝:创建一个新对象,这个对象有着原始对象属性的一份精确拷贝,如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址
深拷贝:将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象
三、浅拷贝、深拷贝、赋值区别
-
当我们把一个对象赋值给一个新的变量时,赋的其实是该对象在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。会互相改变。
-
浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会相互影响
-
深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象的子对象进行递归拷贝,拷贝前后的两个对象互不影响
四、js实现浅拷贝
function shallowCopy(obj) {
var target = {}
for(var i in obj) {
if(obj.hasOwnProperty(i)) {
target[i] = obj[i]
}
}
return target
}
五、js实现深拷贝
1.通过递归方式实现(递归调用浅拷贝)
function deepClone(obj) {
var cloneObj = {}
if(obj === null) return obj
if(obj instanceof Date) return new Date(obj)
if(obj instanceof RegExp) return new RegExp(obj)
if(typeof !== 'object') return obj
for(var i in obj) {
if(obj.hasOwnProperty(i)) {
cloneObj[i] = deepClone(obj[i])
}
}
return cloneObj
}
2.通过JSON.parse(JSON.stringify())也可以实现深拷贝
六、补充知识instanceof
instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上
A instanceof B :B的prototypeof有没有在A的原型链上
本文出现的代码都是自学,然后整理出来的
本人属于入门前端不久的小白,所以代码仅供参考!!!
有错误的欢迎指正,