<template>
<div>
<button @click="handleClick">点击</button>
</div>
</template>
<script>
export default {
data () {
return {
myData: {
name: 'x',
list: [{ name: 'China' }, { name: 'England' }, { name: 'America' }]
}
}
},
methods: {
handleClick () {
this.funA()
},
async funA () {
const myDateNew = { ...this.myData }
myDateNew.age = 23
const data2 = await this.funB(myDateNew)
// 下面3个属性输出的list都是相同的
// 当引用数据类型作为函数参数时, 该如何改, 才不会改变了源数据 this.myData 中list的数据
console.log('myData', this.myData, myDateNew, data2)
},
funB (data) {
const newData = { ...data }
newData.list.forEach(element => {
element.num = Math.ceil(Math.random() * 100)
})
return newData
}
}
}
</script>
首先,
myData
是一个对象的引用,所以{ ... this.myData }
成功地产生了一个新对象,其属性与myData
相同,但它的确和myData
是不同的对象。我们假设给一个变量叫x
给它,也就是现在,
x.list === myData.list
的结果是true
,因为它们引用的同一个对象(数组)。要想不改变这个数组,需要
问题是,虽然是两个不同的数组了,但是它们内部仍然引用的是相同的对象,比如
x.list[0] === myData.list[0]
……所以,你这个问题实际是涉及到了“深拷贝”的问题,搜一搜,或者看看这个有点关系的回答