自己实现了一个对象深度克隆:
主要缺陷只有一个:
- 对键值为循环调用的对象无能为力,会堆栈溢出。
作用:
适合常规的纯数据对象深度克隆。
删掉类型后,js就可以直接跑
Array.prototype.o_entries = function (type, fn) {
return Array.prototype[type].call(this, x => fn.call(x, x[0], x[1]))
}
Object.fromEntries =
Object.fromEntries ||
function(arr: o_entries) {
let obj = {}
arr.o_entries("map", (a, b) => {
obj[a] = b
})
return obj
}
Object.type = (obj) => Object.getPrototypeOf(obj).constructor.name
function clone(o: any, record = [o]) {
switch (Object.type(o)) {
case "Array":
return o.map(x => clone(x));
case "Object":
return Object.fromEntries(
Object.entries(o).o_entries("map", (a, b) => [a, clone(b, record)])
);
default:
return o;
}
}