Javascript.info-克隆总结

Object.fromEntries(Object.entries(obj))

方法原理特点
{…obj}解构浅层拷贝,忽略Symbol属性
Object.assign({},obj)赋值语句浅层,包含Sybbol属性
for (let key in user) {clone[key] = user[key]}迭代浅层,忽略Symbol属性
lodash 库的 _.cloneDeep(obj)迭代+类型判断递归深层,忽略Symbol属性
JSON.parse(JSON.stringify(obj))JSON深层,忽略Symbol属性

Object.fromEntries(Object.entries(obj))

image-20251110165735573

基于对象特殊属性

所以如果我们想要一个“更好”的克隆,那么 Object.defineProperties 是首选。 Object.getOwnPropertyDescriptors 返回包含 symbol 类型的和不可枚举的属性在内的 所有 属性描述符。

js
let clone = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj));

继承

js
let clone = Object.create(
  Object.getPrototypeOf(obj),
  Object.getOwnPropertyDescriptors(obj)
);

此调用可以对 obj 进行真正准确地拷贝,包括所有的属性:可枚举和不可枚举的,数据属性和 setters/getters —— 包括所有内容,并带有正确的 [[Prototype]]

评论

评论加载中……