对象拷贝(二)浅拷贝

浅拷贝

首先看一个vue的例子

  <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
  <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(){
        this.list.push(this.student)
      }
    }
  })
  </script>

首先添加几个相同的数据
例如:
小明 2
小明 2
小明 2
小明 2
当改变输入框中的内容后
如:
小红 3
那么之前的数据就会变成
小红 3
小红 3
小红 3
小红 3
这是因为data中数据student是对象,引用类型的地址存储在栈中,
引用类型的数据存储在堆中,提交的数据对应的都是同一个地址,因此改变一个就会全部改变。

解决方案
浅拷贝
  let obj = {
    name: "小明",
    age: 2
  }
  function copy(obj){
    let newObj = {}
    for(let i in obj){
      newObj[i] = obj[i]
    }
    return newObj
  }
  let newObject = copy(obj)
  obj.name = "小红"
  console.log(obj) // {name:"小红",age:2} 
  console.log(newObject) // {name:"小明",age:2}

完整解决的方法就是在vue中添加一个浅拷贝的方法,再将拷贝的副本传到数组中去

  <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
  <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(){
        this.list.push(
          this.copy(this.student)
        )
      },
      copy(obj){
        let newObj = {}
        for(let i in obj){
          newObj[i] = obj[i]
        }
        return newObj
      }
    }
  })
  </script>
posted @ 2021-07-26 22:00  `Duet`  阅读(55)  评论(0编辑  收藏  举报