深拷贝和浅拷贝的思考

126 阅读1分钟

计算机语言中有堆和栈的概念,在js中,简单对于堆的理解是引用的数据类型,栈就是基本数据类型。所以也就有了深浅拷贝的概念,那为什么有如下的问题。主要是赋值的操作作为堆内操作,只是单纯的地址引用。

var a = {t:1}
var b = a
b.t = 1
a.t 也是1

那么如何实现深拷贝呢

第一种实现思路

如果序列换中存在正则等返回结果就是空

function deepClone(fn){
  return JSON.parse(JSON.stringify(fn))
}

第二种实现思路

对于对象中的元素,在基本的数据类型中进行赋值操作。实现对于变量值得赋值

function deepClone(fn){
  let c = Array.isArray(fn)?[]:{}
  if(fn === null){
    return fn
  }
  if(fn instanceof RegExp){
    return fn
  }
  if(typeof fn !== 'object'){
    console.log(fn)
    return fn
  }
  for(let key in fn){
    console.log(fn[key])
    c[key]=deepClone(fn[key])
  }
  console.log(c)
  return c;
}
var a={
  b:1,
  tt:[1,3,4],
  dd:null,
  e:new RegExp(/\d/)
}
console.log(deepClone(a)+"********************")