深拷贝实现

112 阅读2分钟
  • 首先定义一个方法
 var deepCopy = (obj) => {
    
}
  • 其次,方法中需要有一个空对象承载拷贝的数据
var deepCopy = (obj) => {
    var ret = {}
    
    return ret
}

  • 接下来循坏对象中的每一个数据,复制给新对象
var deepCopy = (obj) => {
    var ret = {}
    for(var key in obj){
    	ret[key] = obj[key]
    }
    return ret
}
  • 到这里已经完成了第一层的数据拷贝,下面进行第二层数据拷贝
var deepCopy = (obj) => {
    var ret = {}
    for(var key in obj){
    	var value = obj[key]
    	// 子类如果还是对象就进行第二层循环
    	if(typeof valeu === 'object'){
           for(var key1 in value){
           	  var value1 = value[key1]
              ret[key][key1] = value1
          }
        } else ret[key] = value
    }
    return ret
}
  • 通过上面方法进行一层一层的循环,就可以把对象全部拷贝一遍
  • 下面就需要用到递归的思想
var deepCopy = (obj) => {
    var ret = {}
    for(var key in obj){
    	var value = obj[key]
        // 通过判断下一级的类型是否为对象, 如果是对象则进行递归
        // 递归的原理就是一层一层的递归下去,当递归到最后的时候再一层一层的把数据传递过来,
        // 所以递归需要一个终止值,来决定递归是否结束
    	ret[key] = typeof value === 'object' ? deepCopy(value) : value
    }
    return ret
}
  • 下面对代码进行一些优化
  • 我们需要考虑几个条件
  1. 传过来的数据是否是对象
  2. 对象是否为空
  • 下面看最终版代码
var deepCopy = (obj) => {
	if (!isObject(obj)) return obj;
    if (JSON.stringify(obj) === '{}') return {}

    var ret = {}
    for(var key in obj){
    	var value = obj[key]
        // 通过判断下一级的类型是否为对象, 如果是对象则进行递归
        // 递归的原理就是一层一层的递归下去,当递归到最后的时候再一层一层的把数据传递过来,
        // 所以递归需要一个终止值,来决定递归是否结束
    	ret[key] = isObject(value) ? deepCopy(value) : value
    }
    return ret
}
// 判断对象
function isObject(isObj) {
 	return typeof isObj === 'object' && isObj !== null;
}