手写深拷贝
function deepClone(target) {
let result
if (typeof target === 'object') {
if (Array.isArray(target)) {
result = []
for (let i in target) {
result.push(deepClone(target[i]))
}
} else if (target === null) {
result = target
} else if (target.constructor === RegExp) {
result = target
} else if (target.constructor === Date) {
result = target
} else {
result = {}
for (let i in target) {
result[i] = deepClone(target[i])
}
}
} else if (typeof target === 'function') {
// 如果是函数
result = new Function('return ' + target.toString())
} else {
// 如果是基本数据类型,如number、string、boolean、undefined
result = target
}
return result
}
深拷贝
特点:拷贝的时候会生成一份新的数据,修改拷贝以后的数据不会原数据。
浅拷贝
特点:拷贝的时候只是拷贝了一份引用,修改拷贝以后的数据会影响原来的数据。
扩展运算符是深拷贝。
Array.prototype.slice()是深拷贝方式。
Array.prototype.concat()是深拷贝方式。
Object.assign()是浅拷贝方式
JSON.parse(JSON.stringify())是一种深拷贝方式。但需要注意拷贝的数据里面不能有函数,因为JSON.stringify(),JSON.parse()处理不了函数。
2.拷贝数据的方式:
(1)直接赋值给一个变量
(2)Object.assign() 浅拷贝
(3)Array.prototype.slice() 深拷贝
(4)Array.prototype.concat() 深拷贝
(5)JSON.parse(JSON.stringify()) 深拷贝
(6)Loadsh库中的API,如:.clone()、.cloneDeep()
(7)扩展运算符…arr 深拷贝
…