复制
1.遍历复制(for in)
特征:不修改引用关系(原来的属性还在),仅能复制字符属性,Symbol不能复制,不可枚举属性不能复制,原型链不能复制。浅复制
2.JOSN.parse(JSON.stringify(obj)) 转换复制
特征:修改引用关系(相当于创建一个新的对象,不再拥有原来的属性),仅能复制字符属性,Symbol不能复制,不可枚举属性不能复制,原型链不能复制,函数和其他类型不能复制。深复制
3.{…obj}解构赋值复制
特征:修改引用关系,Symbol和函数都能复制,不可枚举属性和原型链都不能复制。浅复制
4.Object.assign()对象复制
特征:不修改引用关系,可以复制属性、方法、Symbol类型,不可枚举属性和原型链都不能复制。浅复制
深复制**
1.使用defineProperty***
function cloneObject(source,target){
if(source === null||source === undefined) return source;
if(source===document) return;
//判断target是不是继承对象的实例,是不是引用类型(null,undefined,Boolean,string,number都不是引用类型)
if(!Object.prototype.isPrototypeOf(target)){
//判断源对象是不是dom元素
if(HTMLElement.prototype.isPrototypeOf(source)){
//创建dom元素
target = document.createElement(source.nodeName);
}else if(source.constructor === RegExp){
// 任何正则表达式都有source和flags,source是正则内容,flags是正则修饰符
// 因为这两个属性都是只读属性,不能写入,必须通过构造函数创建时带入
target = new RegExp(source.source,source.flags);
}else if(source.constructor === Date){
// 日期对象在创建的对象中将原有的日期对象放入,可以让当前日期对象变为原有日期对象的值,但是没有引用关系
targer = new Date(source);
}else if(source.constructor === Function)