深拷贝(深度克隆):复制对象的内容,此时对对象内容的修改是独立的,不会影响到之前的对象。
所以这是编程时的选择问题,如果你想拥有当前对象内容的复制,从而独立地对它进行操作,就用深度克隆
function deepClone(data) {
const type = this.judgeType(data)
let obj
if (type === 'array') {
obj = []
} else if (type === 'object') {
obj = {}
} else {
// 不再具有下一层次
return data
}
if (type === 'array') {
// eslint-disable-next-line
for (let i = 0, len = data.lengthi <leni++) {
obj.push(this.deepClone(data[i]))
}
} else if (type === 'object') {
// 对原型上的方法也拷贝了....
// eslint-disable-next-line
for (const key in data) {
obj[key] = this.deepClone(data[key])
}
}
return obj
}
function judgeType(obj) {
// tostring会返回对应不同的标签的构造函数
const toString = Object.prototype.toString
const map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object',
}
if (obj instanceof Element) {
return 'element'
}
return map[toString.call(obj)]
}