都是浅拷贝,对象里面都是基本数据类型,为什么第一个会改变源数据

let a=row//第一个
let a={...row}//第二个
a.id=0
//第一个row会跟着变,第二个row不会跟着变
//row就是下图打印出来的②
//{...row}就是下图答应出的①

img

你好,先说一个简单的概念,基本类型赋值 就是独立的,比如a=苹果 b=a 这是两个苹果 你咬a一口 b不会有变换
引用类型是存放的是一个地址 比如 obj={a:苹果} obj是一个地址 他指向{a:苹果} 当你让b=obj时 b就获得了这个地址 b也指向{a:苹果} 此时只有一个苹果
回到你问题,你的row是个对象属于引用类型数据,引用类型你可理解为一把指针 它指向一个地址
你把 row赋值给了a 此时a也是一个指针, 并且他俩都指向同一个地址 所以不管那个修改地址内容 他俩都会变
第二个问题 实际对于 只有一层的对象 也就是子属性都是基本类型的对象 你用...结构 实际是深拷贝
...等于挨个取出对象中的东西 还是举个例子 a={name:'苹果'} b={...a} 这个过程你可以理解为首先我们根据a的指针找到了{name:'苹果'} 之后我们把这个对象的门打开 把里面的东西都复制出来一份 现在{name:'苹果'}有一个苹果 我们就复制一个苹果这是新的苹果给了b 这是两个独立苹果.
但假设打开门我们发现 里面不止有基本数据类型还有引用数据类型时,我们复制的引用类型实际还是一个地址.

img

img

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7631884
  • 你也可以参考下这篇文章:在前端开发中,有哪些因素会导致页面卡顿
  • 除此之外, 这篇博客: 如何一句话激怒前端开发中的 你怎么连电脑都不会修? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 劳资是写代码的,不是搞电脑的

    640.webp

  • 您还可以看一下 陈槐老师的零基础新手入门软件测试必知必会课程中的 常见软件测试面试题之电梯需要思考的维度小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    可能的原因是对象里面包含了引用类型的数据,浅拷贝只是复制了引用,而没有复制实际的对象。因此,在修改拷贝对象的时候,实际上修改了原对象所引用的数据。解决方案是使用深拷贝,即将拷贝对象中的引用类型数据也进行拷贝,而不是复制引用。常见的深拷贝方法包括JSON.stringify()和JSON.parse()方法,lodash库的_.cloneDeep()方法等。下面是一个使用JSON方法实现深拷贝的示例代码:

    let obj = {
      name: 'John',
      age: 30,
      address: {
        city: 'New York',
        country: 'USA'
      }
    };
    
    let copyObj = JSON.parse(JSON.stringify(obj)); // 使用JSON方法进行深拷贝
    
    copyObj.address.city = 'San Francisco';
    console.log(obj.address.city); // 输出 New York,原对象未被修改
    console.log(copyObj.address.city); // 输出 San Francisco,拷贝对象已被修改
    

    需要注意的是,在使用JSON方法进行深拷贝的时候,需要注意拷贝对象中不能包含循环引用,否则会出现无限递归的情况,导致程序崩溃。