手写深浅拷贝

tech2024-11-06  17

深浅拷贝

基本数据类型放在栈(stack) 引用数据类型放在堆(heap)

浅拷贝

浅拷贝只拷贝一层目录 当数组内部有数组或者对象时 拷贝的是引用地址

方法

for in 遍历 把目标的属性挂载到另一个目标上

function clone(target) { // 如果不是数组或者对象 if (target && typeof target !== 'object') { // 直接复制 var clone = target console.log(clone) } // 如果是数组或对象 else if (target && typeof target === 'object') { // 先判断是数组还是对象 var clone = Array.isArray(target) ? [] : {} // 遍历目标 for (var key in target) { clone[key] = target[key] } } return clone }

es6方法

扩展运算符 (…)

// 数组 const targetArr = [1,2,3,[1,2],{a : 1}] const cloneArr = [...targetArr] // 对象 const targetObj = {name : 'lisi' , age : 18 , a : [1,2] , b : {name : 123}} const cloneObj = {...targetObj}

Array.concat() 数组拼接

const arr = [1,2,3] const cloneArr = [].concat(arr)

Object.assign() 对象拼接

const obj = { name : 'lisi' , age : 18 , lisi : { name : 'lisi'}} const cloneObj = Object.assign({} , obj)

深拷贝

通过遍历再判断的方法 如果深层目录还是引用值 递归

方法

function deepClone (target) { // 如果不是数组或者对象 if (target && typeof target !== 'object') { // 直接复制 var clone = target console.log(clone) } // 如果是数组或对象 else if (target && typeof target === 'object') { // 先判断是数组还是对象 var clone = Array.isArray(target) ? [] : {} // 遍历目标 for (var key in target) { if (target.hasOwnProperty(key)) { // 再判断目标属性是否是数组或对象 if (target[key] && typeof target[key] === 'object') { // 如果是 递归进行深度克隆 clone[key] = deepClone(target[key]) } else { clone[key] = target[key] } } } return clone } }
最新回复(0)