Web前端必做笔记之一:对象拷贝(二) 浅拷贝
<div id="app">
<form @submit.prevent = "insert">
<input type="text" v-model="student.name">
<input type="text" v-model="student.age">
<button>添加</button>
</form>
<ul>
<li v-for = "item in list">
姓名:{{item.name}}
年龄:{{item.age}}
</li>
</ul>
</div>
script>
new Vue({
el: '#app',
data: {
student:{
name:'',
age:''
},
list:[]
},
methods:{
insert(){
console.log('hello world');
this.list.push(this.student);
}
}
})
</script>
首先我在输入框中写入小明和他的年龄,然后点添加,就可以看到添加成功了,我再添加三个,可以无限添加的,这是没有问题的,现在呢我把这个小明改成’小红’,然后我们会看到下面所有的小明都变成了小红,那为啥都变成了小红呢?
我们建立了一个数组叫做list[],我们往里面添加了东西,添加的student这个对象,我们往里面添加的都是这个student对象,而对象是存储在堆内存中, 他们都指向相同的一个对象,都是小明,这就是我们为啥改一个都变, 如何解决这个问题,我们可以给这个student做个克隆,或者说是拷贝完成之后,让这些对象不是一个对象
<script>
let obj = {
name:"小明",
age:2
}
let newObj = {};
for(let i in obj){
console.log(obj[i]);
newObj[i] = obj[i];
}
obj.name ="小红";
console.log(obj);
console.log(newObj);
</script>
function copy(obj){
let newObj = {};
for(let i in obj){
console.log(obj[i]);
newObj[i] = obj[i];
}
return newObj;
}
let newObject = copy(obj);
console.log(obj);
console.log(newObject);
<script>
new Vue({
el: '#app',
data: {
student:{
name:'',
age:''
},
list:[]
},
methods:{
insert(){
console.log('hello world');
this.list.push(
this.copy(this.student));
},
copy(obj){
let newObj = {};
for(let i in obj){
console.log(obj[i]);
newObj[i] = obj[i];
}
return newObj;
}
}
})
</script>
|