JS数据传递和深浅拷贝

function add(a){
  a++
}
var a=3
add(a)
add(a)
console.log(a);

函数里面形参赋值不回影响到外面的值打印出来为3

function obj(a){
    a={n:2}
}
var a={n:3}
obj(a)
console.log(a)

复杂类型时也一样不会影响,打印出来{n:3}

function increase(a) {

  a.n = 2;
}
var a = { n: 1 };
increase(a);

console.log(a);//{n:2}

这时的值改变了是应为形参的地址和外面值的地址指向的是同一个地址所以值会被改变。

let obj={
  a:1,
  b:2,
  c:3
}
let obj2=obj
obj2.b=3
console.log(obj)//{a: 1, b: 3, c: 3}

由于复杂数据类型赋值时,并不是把真正的数据给另外一个值,而是有一个指针指向一个地址,这个地址里面就是储存的值,所以就导致了当一个对象的值改变时,另外一个对象的值也会被改变。这个时候我们就可以使用深拷贝和浅拷贝解决这种问题。

1.浅拷贝

1.1for循环遍历

let obj={
  a:1,
  b:2,
  c:3
}


const newObj={}
for(var i in obj){
  newObj[i]=obj[i]
}
newObj.b=3
console.log(obj,'obj',newObj,'newObj')//{a: 1, b: 2, c: 3} 'obj' {a: 1, b: 3, c: 3} 'newObj'

个人理解通过for循环是进行赋值而不是让对象指向指针,所以改变值时只是改变了newObj的值达到浅拷贝的目的。

1.2扩展运算符

let newObj={...obj}
newObj.a=2
console.log(obj,'obj',newObj,'newObj')//{a: 1, b: 2, c: 3} 'obj' {a: 2, b: 2, c: 3} 'newObj'

2.深拷贝当一个复杂类型里面嵌套了另外一个复杂类型,如

let newObj={...obj}
newObj.d.e=2
console.log(obj)//a: 1 b: 2 c: 3 d: {e: 2, f: 5}

这时就需要使用深拷贝了

2.1递归

  const newObj = {}
  function deepCopy(newObj, obj) {
    for (let i in obj) {
      // 判断是否是一个复杂类型的数据
      if (Object.prototype.toString.call(obj[i]) === '[object Object]') {
        newObj[i] = {}
        deepCopy(newObj[i], obj[i])
      } else if (Object.prototype.toString.call(obj[i]) === '[object Array]') {
        newObj[i] = []
        deepCopy(newObj[i], obj[i])
      } else {
        newObj[i] = obj[i]
      }
    }
  }

  deepCopy(newObj, obj)

2.2通过JSON的格式转换,缺点是如果对象中有值为undefined则无法拷贝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值