js 的 数据引用之对象
对象的引用规则
在脚手架中,对象的赋值如:
const params = {test: 1,target:2}
const target = params
console.log(parmas,target)
//{test1: 1,test2:2} {test1: 1,test2:2}
target.test1 = 4
console.log(parmas,target)
//{test1: 4,test2:2} {test1: 4,test2:2}
由此可见,对象的赋值,其实是引用,而不是赋值,和C和C++中的数组的传递一样。
js 对象的赋值
由上面可见。为了保证数据的互不干扰,我们不希望使用对象的引用,而是使用,数据复制的形式,来对数据进行处理,这样可以规避数据的相互影响。
方式一: 使用方法Object.assign(target,source)
js提供了方法:Object.assign(target,source),可以将枚举对象进行扩充。如:
const target = {}
const source = {a:1,b:2}
Object.assign(target,source)
console.log(target)
//target = {a:1,b:2}
console.log(source)
//source = {a:1,b:2}
target.a = 2
console.log(target)
//target = {a:2,b:2}
console.log(source)
//source = {a:1,b:2}
这样,就可以避免数据的相互干扰。
当然,不建议使用这个方法
它只能实现一层的深拷贝,也就说,当你需要拷贝的对象的属性中,有对象的话,那么,你最后得到的结果。会有问题。
总的来说,这个也是一个浅拷贝,不仅如此,基本上直接提供给你的拷贝方式都是浅拷贝。
方法二: 直接赋值
直接将对象一一赋值,如:
const source = {a:1,b:2}
const target = {a:source.a,bsource.b}
console.log(target)
//target = {a:1,b:2}
console.log(source)
//source = {a:1,b:2}
target.a = 2
console.log(target)
//target = {a:2,b:2}
console.log(source)
//source = {a:1,b:2}
方法三: 类型转化
在js中,String 类的赋值,是从新开辟内存,所以,我们可以通过类型转化来实现。如:
const source = {a:1,b:2}
const target = JSON.stringify(source)
console,log(target)
//{"a":1,"b":2}
const result = JSON.parse(target)
console.log(result)
//target = {a:1,b:2}
result.a = 2
console.log(result)
//result= {a:2,b:2}
console.log(source)
//source = {a:1,b:2}