问题:变量a和对象b。直接使变量a = b,改变a的值会使对象b本身跟着改变。
原因:变量a得到的是对象b的地址,a和b指向内存堆中同一个对象。
解决:
①:解构对象b再赋值给变量a
a = {...b}
②:JSON序列化
et a = JSON.parse(JSON.stringify(b))
③:对象合并方法,复制对象的可枚举属性到目标对象。
Object.assign(target, ...sources)
target--->目标对象 source--->源对象
Object.assign(a, b)
补充:Object.assign对象合并方法
eg:const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}
将源对象(source)的所有可枚举属性,复制到目标对象(target)。如果该参数不是对象,则会先转成对象。
Object.assign方法实行的是浅拷贝,而不是深拷贝。如果源对象某个属性的值是对象, 那么目标对象拷贝得到的是这个对象的引用。改变源对象会使复制的目标对象也改变, 而JSON序列化和解构不会。如果改变目标对象,三种方式都不会使源对象发生变化。
Eg:const obj1 = ref<any>({
name:'yyy',
age:'18'
})
const obj2 = ref<any>({
hobby:'read books',
sex:'girl',
})
Object.assign(data,obj1.value,obj2.value) //合并obj1和obj2
//则 data:{ "name": :“yyy”,
"age": "18",
"hobby": "read books",
"sex": "girl" }
obj1.value.name = '改变obj1后的yyy' //改变obj1
//则 data:{ "name": "改变obj1后的yyy",
"age": "18",
"hobby": "read books",
"sex": "girl" }