什么是浅拷贝?
- 对于原始值,进行值的复制。
- 对于引用值,进行地址(指针)值的复制。
站在内存的角度,皆是复制栈内存中存储的数据,再入栈存储。
1、原生API浅拷贝
1.1、包装类对象
Number、String、Boolean、Symbol、BigInt
// Number、String、Boolean、Symbol、BigInt包装类对象都可以使用Object拷贝包装类对象
const newObj = Object(包装类对象.valueOf());
// Number包装类对象
const newNumObj = new Number(Number包装类对象);
// String包装类对象
const newStrObj = new String(String包装类对象);
// Boolean包装类对象
const newBoolObj = new Boolean(Boolean包装类对象);
Note: 包装类,可以去MDN上查询普及,有专更可以看专更(后期加跳转链接)。
1.2、 Object
Object.assign
- 仅能将对象自身中可枚举属性的键和值,拷贝到新对象中(包括:可枚举的符号属性)。
const newObj = Object.assign(新对象, 拷贝对象); // 返回新对象地址值
Object.create
- 能将对象自身中所有属性的属性描述符,拷贝到新对象中定义。
- 能将对象的原型设置为新对象的原型。
const objProto = Object.getPrototypeOf(拷贝对象); // 获取拷贝对象原型
const descriptors = Object.getOwnPropertyDescriptors(拷贝对象); // 获取拷贝对象所有属性的属性描述符
const newObj = Object.assign(objProto, descriptors);
Object.entries 和 Object.fromEntries
- 仅能将对象自身中可枚举属性的键和值,拷贝到新对象中(不包括:可枚举的符号属性)。
const objEntries = Object.entries(拷贝对象); // 键值对形式的二维数组,例如:[['key', 'value']]
const newObj = Object.fromEntries(objEntries); // 键值对形式的对象
TODO:
- 包装类专更后,更新超链接
- 想象不到的Array浅拷贝API(专更)
- 编码你要的浅拷贝API(专更)
- 原生API深拷贝缺陷(专更)
- 编码你要的深拷贝API(专更)
专注于原创短更,便于碎片化涉猎知识。希望我走过的路,留下的痕迹,能对你有所启发和帮助。
转发请注明原处,平台投稿请私信。