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))

基于对象特殊属性
所以如果我们想要一个“更好”的克隆,那么 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]]。
评论
评论加载中……