js

深度拷贝(递归拷贝)

2019-06-14  本文已影响0人  CRUD_科科

深度拷贝

拷贝出来的和被拷贝的没有关系,即被拷贝的属性改变,拷贝出来的属性不会跟着改变。

// 深度拷贝 递归拷贝  (拷贝出来的和被拷贝的没有关系)
function deepClone(value) {
  // null undefined直接返回 null == undefined是true,但是null == undefined是false
  if (value == null) return value; // 因为上面,所以这里只判断null
  if (typeof value !== 'object') return value;  // 不是对象的有:Number、Boollean、Function
  if (value instanceof Date) return new Date(value);  // 如果是日期返回重新创建的日期
  if (value instanceof RegExp) return new RegExp(value);
  // 如果是对象或者数组
  let construc = new value.constructor(value);
  for (const key in value) {
    if (value.hasOwnProperty(key)) {
      construc[key] = deepClone(value[key]); // 如果是obj,那么继续调用自己循环,这就叫做递归拷贝
    }
  }
  return construc;
}
// console.log(new {}.constructor)  // {}.constructor = Object()  new Object() = {} 
console.log(deepClone([1,2,{a:{b:1,c:{d:function(){}}}}]))
上一篇下一篇

猜你喜欢

热点阅读