JavaScript关于深浅拷贝

110 阅读1分钟

浅拷贝

只是拷贝了第一级,若对象里面还有对象(多维对象)是没有拷贝完全的,改变拷贝的项会改变原来的对象。

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