let a=row//第一个
let a={...row}//第二个
a.id=0
//第一个row会跟着变,第二个row不会跟着变
//row就是下图打印出来的②
//{...row}就是下图答应出的①
你好,先说一个简单的概念,基本类型赋值 就是独立的,比如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 这是两个独立苹果.
但假设打开门我们发现 里面不止有基本数据类型还有引用数据类型时,我们复制的引用类型实际还是一个地址.
劳资是写代码的,不是搞电脑的
答案:
可能的原因是对象里面包含了引用类型的数据,浅拷贝只是复制了引用,而没有复制实际的对象。因此,在修改拷贝对象的时候,实际上修改了原对象所引用的数据。解决方案是使用深拷贝,即将拷贝对象中的引用类型数据也进行拷贝,而不是复制引用。常见的深拷贝方法包括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方法进行深拷贝的时候,需要注意拷贝对象中不能包含循环引用,否则会出现无限递归的情况,导致程序崩溃。