浅拷贝
只是拷贝了第一级,若对象里面还有对象(多维对象)是没有拷贝完全的,改变拷贝的项会改变原来的对象。
let obj = {
a: 100,
b: [10,20,30],
c: {x:10},
d: /^\d+$/
}
- 浅拷贝只拷贝第一层: let obj2= obj
- es6:
let obj2 = {}
for (let key in obj){
if(obj.hasOwnProperty(key)) break
obj2[key] = obj[key]
}
console.log(obj===obj2)//=>false
obj2.c.x=1000 //=>obj也被改变了
- es6的展开运算符也可以直接实现浅克隆:
let obj2 = {...obj}
深拷贝
- 若对象里面的对象不是函数,正则,日期格式则可以将之变成字符串再转成对象
let obj2 = Json.parse(Json.stringify(obj)) // 项目中常用有弊端
function deepClone(obj) {
//=>过滤特殊条件
if(obj===null) return null
if(typeof obj !== 'obj') return obj
if (obj instanceof RegExp){
return new RegExp(obj)
}
if (obj instanceof Function){
return new Function(obj)
}
if (obj instanceof Date){
return new Date(obj)
}
//=>不直接创建空对象目的:克隆的结果和之前保持相同的所属类
let newObj = new obj.constructor
for ( let key in obj ) {
if ( obj.hasOwnProperty(key) ) {
newObj[key] = deepClone(obj[key])
}
}
return NewObj
}
console.log(obj === obj2)//=> false
console.log(obj.c === obj2.c)//=>false