浅拷贝指的是创建一个新对象,其中包含原始对象的引用(指针),并没有真正将原始对象的数据复制到新对象中,因此新对象与原始对象共享部分或全部数据。
深拷贝指的是创建一个新对象,并递归地将原始对象的数据复制到新对象中,因此新对象与原始对象之间不存在数据共享
浅拷贝:拷贝的对象和源对象相互有影响
深拷贝:拷贝的对象和源对象没有影响
浅拷贝方式一Object.assign(目标对象 ,源对象)
const obj = { name: 'longge', age: 16, arr: [] }
Object.assign(newObj, obj)console.log(newObj)obj.age = 17obj.arr.push(1)console.log(newObj, obj)
浅拷贝方式二: 展开运算符
const obj = { name: 'longge', age: 16, arr: [] }
const newObj = { ...obj }console.log(newObj)newObj.arr.push(10)console.log(obj)const arr = [1, 2, 3, { a: 1 }]const newArr = [...arr]console.log(newArr)newArr[3].a = 100console.log(arr)
浅拷贝方式三: concat / slice
const arr = [1, 2, 3, { a: 1 }]// const newArr = [].concat(arr)// console.log(newArr)// newArr[3].a = 100// console.log(arr)const newArr = arr.slice()console.log(newArr)newArr[3].a = 100console.log(arr)
深拷贝 JSON.stringify 与 JSON.parse
缺点 忽略函数、属性值为undefined的属性
* const newObj = JSON.parse(JSON.stringify(obj))console.log(newObj)//{name: 'longge', age: 16, arr: Array(0), o: {…}, d: '2023-11-23T11:15:04.081Z'}obj.arr.push(100)console.log(obj, newObj)
深拷贝 自己实现 递归
function deepClone(obj) {if (obj == null) return objif (obj instanceof Date) return new Date(obj)if (typeof obj !== 'object') return obj// obj 是对象或数组const newObj = new obj.constructor()for (let k in obj) {newObj[k] = deepClone(obj[k])}return newObj}const o = { a: 1, b: 2, c: { m: 20 } }const newObj = deepClone(obj)// newObj.c.m = 30console.log(newObj)// console.log(o)
函数自己调用自己
function getNum(n) {if (n === 2) return 2if (n === 1) return 1return getNum(n - 1) + getNum(n - 2)}console.log(getNum(10))getNum(5) getNum(4)+ getNum(3) 5 + 3getNum(4) getNum(3)+ getNum(2) 3 + 2getNum(3) getNum(2)+ getNum(1) = 2 +1