浅拷贝
将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用复杂类型的传址
如果拷贝基础数据类型就直接拷贝
如果拷贝复杂数据类型就是赋值(拷贝后的 会影响拷贝前的值)
深拷贝
创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”,复制一份完全一致但非同一地址的数据。
浅拷贝方法
newObj = Object.assign({},obj)- 解构
newObj = {...obj} Array.concat()数组连接Array.slice()数组切片
深拷贝方法
-
json.parse、json.stringigy
对于
undefined、任意的函数以及symbol三个特殊的值分别作为对象属性的值、数组元素、单独的值时 JSON.stringify()将返回不同的结果。// 1.作为对象属性的值 const data = { a: "aaa", b: undefined, c: Symbol("dd"), fn: function() { return true; } }; JSON.stringify(data); // 输出: "{"a":"aaa"}" // 2.作为数组元素 JSON.stringify(["aaa", undefined, , Symbol('dd'),function aa() {return true}]) // 输出:"["aaa",null,null,null]" // 3.作为单独的值 JSON.stringify(function a (){console.log('a')}) // undefined JSON.stringify(undefined) // undefined JSON.stringify(Symbol('dd')) // undefined -
递归
function deepClone(obj){ // Array.isArray(object) 判断是否为数组 let newObj = Array.isArray(source) ? [] : {} // for in 遍历数组或对象 for( let i in obj){ // 忽略从原型继承的属性,不进行拷贝 if(obj.hasOwnProperty(i)){ const value = obj[i] // 获取值 if(value instanceof Array || value instanceof Object){ newObj[i] = deepClone(value) }else{ newObj[i] = value } } } return newObj }