不难想象的原生API浅拷贝

117 阅读2分钟

什么是浅拷贝?

  • 对于原始值,进行值的复制。
  • 对于引用值,进行地址(指针)值的复制。

站在内存的角度,皆是复制栈内存中存储的数据,再入栈存储。

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(专更)

专注于原创短更,便于碎片化涉猎知识。希望我走过的路,留下的痕迹,能对你有所启发和帮助。

转发请注明原处,平台投稿请私信。