浅拷贝==》既传值,也传地址值

    1. var arr=[1,2,3];
    2. var sum=arr;
    3. console.log(sum);//[1,2,3]
    4. sum.push(4);
    5. console.log(arr);//[1,2,3,4]

    实现浅拷贝

    1. //实现浅拷贝 传的是数组里面对象的地址值和值,
    2. var arr=[{name:"cheng"},{name:"li"},{name:"ming"}]
    3. var res=[...arr]
    4. res[0].name="huang"
    5. res.push({name:"vue"})//push的是外面的,所以不影响内部的对象层
    6. console.log(arr);

    image.png
    深拷贝==》只传值

    1. /* 数组里面每一项是基本数据类型的一个深拷贝 */
    2. var arr=[1,2,3];
    3. var sum=[...arr];
    4. console.log(sum);//[1,2,3]
    5. arr.push(4);
    6. console.log(sum);//[1,2,3]
    7. var arr=[1,2,3];
    8. var sum=[].concat(arr);
    9. console.log(sum);//[1,2,3]
    10. arr.push(4);
    11. console.log(sum);//[1,2,3]
    12. var arr=[1,2,3];
    13. var sum=arr.slice(0);
    14. console.log(sum);//[1,2,3]
    15. arr.push(4);
    16. console.log(sum);//[1,2,3]

    实现深拷贝
    A.如果对象中的属性是简单数据类型
    1.{…obj} 2.Object.assign()

    1. var obj = { name: "cheng", age: 18 };
    2. var a = { ...arr };
    3. var a = Object.assign({}, obj);
    4. obj.id = 1001;
    5. console.log(a);

    B.如果是复杂数据类型

    1. //复杂类型实现深拷贝
    2. var obj = { name: { name: "ming" } };
    3. function deepClone(obj) {
    4. let result;
    5. //1.能够识别数组还是对象
    6. if (obj instanceof Array || obj instanceof Object) {
    7. //2.对拷贝的初始值的设定
    8. if (obj instanceof Array) {
    9. result = []
    10. } else if (obj instanceof Object) {
    11. result = {}
    12. }
    13. //3.需要将obj克隆到result中
    14. for (let key in obj) {
    15. result[key] = deepClone(obj[key])
    16. }
    17. return result;
    18. }
    19. else {
    20. return obj
    21. }
    22. }
    23. var res = deepClone(obj);
    24. console.log(res);

    vue中的深拷贝

    1. <div id="app">
    2. <!-- 添加功能 -->
    3. name:<input type="text" v-model="newItem.name">
    4. id:<input type="text" v-model="newItem.id">
    5. <button @click="doAdd">添加</button>
    6. <div v-for="item of arr">
    7. {{item.name}}
    8. </div>
    9. </div>
    10. <script>
    11. new Vue({
    12. el: "#app",
    13. data: {
    14. newItem: {
    15. name: "",
    16. id: ""
    17. },
    18. arr: [
    19. { name: "vue", id: 1001 },
    20. { name: "css", id: 1002 },
    21. { name: "js", id: 1003 }
    22. ],
    23. },
    24. methods: {
    25. doAdd() {
    26. var res={...this.newItem}
    27. this.arr.push(res)
    28. }
    29. }
    30. })
    31. </script>