利用DFS广度优先遍历实现深拷贝 发表于 2019-06-05 更新于 2019-09-20 分类于 前端 定义一些工具函数1234567891011121314151617181920212223let _toString = Object.prototype.toString// 类型库let map = { array: 'Array', object: 'Object', function: 'Function', string: 'String', null: 'Null', undefined: 'Undefined', boolean: 'Boolean', number: 'Number'}// 获取类型let getType = item => { // console.log(_toString.call(item)) // [object Number] return _toString.call(item).slice(8, -1) // Number}// 判断类型是否相同let isType = (item, type) => map[type] && map[type] === getType(item) 1234567891011121314151617181920212223242526272829303132let deepCopy = (obj, protoList = []) => { // 首先定义需要被拷贝的对象 let _obj = {} // 判断对象的类型 if (isType(obj, 'array') || isType(obj, 'objest')) { // 根据obj类型,转换_obj的类型 if (isType(obj, 'array')) _obj = [] // 判断obj是否在其父属性列表中包含该属性 let index = protoList.indexOf(obj) if (~index) { // 如果包含该对象,就不能循环了,直接复制_obj _obj = protoList[index] } else { // 如果不包含,先将被赋值对象push值属性列表中,然后进行循环obj的属性,进行赋值。 protoList.push(obj) // 从这步开始,才是进行深度赋值 for (let item in obj) { // 进一步遍历每一个属性,进行赋值 _obj[item] = deepCopy(pbj[item], protoList) } } } else if (isType(obj, 'function')) { // 如果是function,就直接string以后赋值 _obj = eval(`(${obj.toString()})`) } else { // 其他类型,直接赋值 _obj = obj } return _obj }