工做中咱们须要用到对象或者数组的复制功能es6
那么问题来了,我该用什么方法去克隆这个含有数组的表单呢?数组
在解决上述问题以前,咱们应该明确一点什么是深克隆,什么是浅克隆?函数
浅克隆是把一个对象里面的数据复制一份出来,当对象中含有对象或者数组这种引用类型的数据时,浅克隆也只是复制其引用地址,所以修改新复制的对象中引用类型的数据时,原对象也是会改变的,所以浅克隆适用于对象或数组中只有简单数据类型时使用code
对于上面的表单数据的克隆来讲,此时咱们应该采用的是深克隆的方式,由于咱们并不想让原表单对象随咱们新复制出对象的改变而改变orm
着急的兄弟姐妹能够不用看下面,直接copy下面的通用方法,想多了解的,欢迎继续看下去对象
let new = JSON.parse(JSON.stringify(target))
function deepClone(obj) { var o, i, j, k; if (typeof (obj) != "object" || obj === null) return obj; if (obj instanceof(Array)) { o = []; i = 0; j = obj.length; for (; i < j; i++) { if (typeof (obj[i]) == "object" && obj[i] != null) { o[i] = arguments.callee(obj[i]); } else { o[i] = obj[i]; } } } else { o = {}; for (i in obj) { if (typeof (obj[i]) == "object" && obj[i] != null) { o[i] = arguments.callee(obj[i]); } else { o[i] = obj[i]; } } } return o; }
let targetObj = { a: [1, 2], b: 2 } let obj = Object.assign({}, targetObj) targetObj.a[0] = 0 console.log(obj)
let targetObj = { a: [1, 2], b: 2 } let obj = {} for (var k in targetObj) { obj[k] = targetObj[k] } targetObj.a[0] = 0 console.log(obj)经过上面的代码可知,此方法也是浅克隆
let targetObj = { a: [1, 2], b: 2, c: function () { consle.log(333) } } let obj = {...targetObj} targetObj.a[0] = 0 console.log(obj, targetObj)
JSON.parse递归
把对象序列化再解析回来,对象中有函数function则不能正确复制ip
let targetObj = { a: [1, 2], b: 2, c: function () { consle.log(333) } } let obj = {} obj = JSON.parse(JSON.stringify(targetObj)) targetObj.a[0] = 0 console.log(obj)
经过上面代码结果可知,目标对象的改变不会影响到新对象的值,然而属性c并无复制过来字符串
let targetArr = [1, {a: 1, b:2}, 3] let arr = [] for (var i = 0, len = targetArr.length; i < len; i++) { arr[i] = targetArr[i] } targetArr[1].a = 0 console.log(arr, targetArr)
let targetArr = [1, {a: 1, b:2}, 3] let arr = targetArr.concat() targetArr[1].a = 0 console.log(arr, targetArr)
let targetArr = [1, {a: 1, b:2}, 3] let arr = [...targetArr] targetArr[1].a = 0 console.log(arr, targetArr)
let targetArr = [1, {a: 1, b:2}, 3] let arr = targetArr.slice() targetArr[1].a = 0 console.log(arr, targetArr)
let targetArr = [1, {a: 1, b:2}, 3] let arr = Object.assign([], targetArr) targetArr[1].a = 0 console.log(arr, targetArr)
var arr = [1, 2, 3, {a: 1}] var arr1 = Array.from(arr) arr[3].a = 2 console.log(arr1[3].a)
let targetArr = [1, {a: 1, b:2}, 3, function(){console.log(111)}] let arr = JSON.parse(JSON.stringify(targetArr)) targetArr[1].a = 0 console.log(arr, targetArr)