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

深拷贝==》只传值
/* 数组里面每一项是基本数据类型的一个深拷贝 */var arr=[1,2,3];var sum=[...arr];console.log(sum);//[1,2,3]arr.push(4);console.log(sum);//[1,2,3]var arr=[1,2,3];var sum=[].concat(arr);console.log(sum);//[1,2,3]arr.push(4);console.log(sum);//[1,2,3]var arr=[1,2,3];var sum=arr.slice(0);console.log(sum);//[1,2,3]arr.push(4);console.log(sum);//[1,2,3]
实现深拷贝
A.如果对象中的属性是简单数据类型
1.{…obj} 2.Object.assign()
var obj = { name: "cheng", age: 18 };var a = { ...arr };var a = Object.assign({}, obj);obj.id = 1001;console.log(a);
B.如果是复杂数据类型
//复杂类型实现深拷贝var obj = { name: { name: "ming" } };function deepClone(obj) {let result;//1.能够识别数组还是对象if (obj instanceof Array || obj instanceof Object) {//2.对拷贝的初始值的设定if (obj instanceof Array) {result = []} else if (obj instanceof Object) {result = {}}//3.需要将obj克隆到result中for (let key in obj) {result[key] = deepClone(obj[key])}return result;}else {return obj}}var res = deepClone(obj);console.log(res);
vue中的深拷贝
<div id="app"><!-- 添加功能 -->name:<input type="text" v-model="newItem.name">id:<input type="text" v-model="newItem.id"><button @click="doAdd">添加</button><div v-for="item of arr">{{item.name}}</div></div><script>new Vue({el: "#app",data: {newItem: {name: "",id: ""},arr: [{ name: "vue", id: 1001 },{ name: "css", id: 1002 },{ name: "js", id: 1003 }],},methods: {doAdd() {var res={...this.newItem}this.arr.push(res)}}})</script>
