基础学习: deepClone
手写一个 deepClone
几种方法
JSON.strinify
- 手写,递归
- 使用第3方库(略,不过,实际生产建议使用这种)
使用 JSON.stringify
- 优点: 实现简单,适合纯数据的情况
- 缺点: 某些类型无法序列化,而导致数据选择
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
手写
null
以及非 “object
” 类型(typeof
得到),直接排序- 循环(for in) key不变
value
为非 object
类型,直接 deepClone
value
为 object
类型,递归
const obj = {
name: 'aric',
age: 108,
address: {
city: 'wh'
},
children: [
{
name: 'jay',
age: 5
}
]
};
function deepClone(obj) {
if (obj == null) return obj;
if (typeof obj !== 'object') return obj;
var res = Array.isArray(obj) ? [] : {};
for (let key in obj) {
res[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key];
}
return res;
}
console.log(deepClone(obj));
相关问题
- 需要过滤原型上的方法 -
hasOwnProperty
- 需要考虑 circluar 对象 -
try-catch JSON.strinify
,防止无限循环 - dom 节点,使用
cloneNode
来完成 clone