在引入深浅拷贝前 首先讲一下
基本类型 & 引用类型
基本类型:undefined,null,Boolean,String,Number,Symbol
引用类型:Object,Array,Date,Function,RegExp等
不同类型的存储方式:
基本类型:基本类型值在内存中占据固定大小,保存在栈内存中
引用类型:引用类型的值是对象,保存在堆内存中,而栈内存存储的是对象的变量标识符 以及对象在堆内存中的存储地址
浅拷贝&深拷贝
浅拷贝:仅仅是复制了引用,彼此之间的操作会互相影响
深拷贝:在堆中重新分配内存,不同的地址,相同的值,互不影响
简单来说,深浅拷贝的主要区别就是:复制的是引用还是复制的是实例
动手实现深拷贝 利用递归来实现对对象或数组的深拷贝
function deepCopy(obj) {
if (!obj && typeof obj !== 'object') {
throw new Error('error arguments');
}
// const targetObj = obj.constructor === Array ? [] : {}; //多种方法来判断具体对象类型 来创建实例
const targetObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) { //只对对象自有属性进行拷贝
if (obj[key] && typeof obj[key] === 'object') {
targetObj[key] = deepCopy(obj[key]);
} else {
targetObj[key] = obj[key];
}
}
}
return targetObj;
}
看到了一篇关于深拷贝挺不错的文章 上链接 https://juejin.cn/post/6896637675492065287#heading-1
在这个文章里又看到一个知识点 hasOwnProperty
JS hasOwnProperty()方法:检测一个属性是否是对象的自有属性
用来检测一个属性是否是对象的自有属性,而不是从原型链继承的。如果该属性是自有属性,那么返回 true,否则返回 false。换句话说,hasOwnProperty() 方法不会检测对象的原型链,只会检测当前对象本身,只有当前对象本身存在该属性时才返回 true。
自我学习的一点总结 分享记录 一下。