定义一些工具函数
let _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)
let 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
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。