应用场景
- 在vue开发过程中,我们可能会遇到要对双向绑定的数据拷贝一个副本来供我们使用,如果直接浅拷贝会造成一定的风险。比如: 在拷贝后我们要更改副本, 这是由于双向绑定的原因, 之前的数据也会改变, 会出现问题。 这是新手容易忽略的地方。
解决方案
- JSON
const obj1 = JSON.parse(JSON.stringify(obj2))
- 递归
function isObject (o) {
return Object.prototype.toString.call(o) === '[object Array]' || Object.prototype.toString.call(o) === '[object Object]'
}
function deepclone (o, hash = new Map()) {
if (!isObject(o)) {
return o
}
if (hash.has(o)) {
return hash.get(o)
}
const obj = Array.isArray(o) ? [] : {}
hash.set(o, obj)
for (const k in o) {
if (isObject(o[k])) {
obj[k] = deepclone(o[k], hash)
} else {
obj[k] = o[k]
}
}
return obj
}