Object

JS 中除了基础类型 就是 Object 类型 近期也打算再学习一下 Vue 的响应式原理

无论是 Vue2 的 defineProperty 还是 Vue3 的 Proxy 都是建立在 Object 的 api 上的

所以本篇主要是盘点一下 Object 的 api 更详细的文档请移步MDN

创建

  • 对象字面量

const obj = {
  name: 'chou',
  age: 18,
};
  • Object.create()

使用现有的对象来提供新创建的对象的proto

  • new Object()

遍历

Object.keys(obj)

返回一个包含所有给定对象自身可枚举属性名称的数组

Object.entries(obj)

返回给定对象自身可枚举属性的 [key, value] 数组

Object.values(obj)

返回给定对象自身可枚举值的数组

Object.getOwnPropertyDescriptor(obj)

获取一个属性的 descriptor (在 defineProperty 中声明的 未声明的不会返回)

Object.getOwnPropertyNames(obj)

返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括 Symbol 值作为名称的属性)组成的数组

Object.getOwnPropertySymbols(obj)

返回一个给定对象自身的所有 Symbol 属性的数组

Object.getPrototypeOf(obj)

返回指定对象的原型

for...in

删除

  • delete(obj.props)

扩充

Object.defineProperty(obj)

Object.defineProperties(obj)

  • obj: 要在其上定义属性的对象。

  • prop: 要定义或修改的属性的名称。

  • descriptor: 将被定义或修改的属性的描述符。

    • value: 直接给这个属性赋值

    • writable: 是否可修改 默认 false

    • enumerable: 是否可枚举(遍历拿值) 默认 false

    • configurable: 是否可删除 默认 false

    • set

    • get

Object.preventExtensions(obj)

让一个对象变的不可扩展,也就是永远不能再添加新的属性

Object.isExtensible(obj)

判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)

Object.freeze(obj)

冻结一个对象 被冻结后不能进行任何操作

不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。

此外,冻结一个对象后该对象的原型也不能被修改。

Object.isFrozen(obj)

判断一个对象是否被冻结

Object.seal(obj)

封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置

Object.isSealed(obj)

判断一个对象是否被密封

Object.setPrototypeOf(obj, prototype)

设置一个指定的对象的原型

警告: 由于现代 JavaScript 引擎优化属性访问所带来的特性的关系,更改对象的 [[Prototype]]在各个浏览器和 JavaScript 引擎上都是一个很慢的操作。其在更改继承的性能上的影响是微妙而又广泛的,这不仅仅限于 obj.proto = ... 语句上的时间花费,而且可能会延伸到任何代码,那些可以访问任何[[Prototype]]已被更改的对象的代码。如果你关心性能,你应该避免设置一个对象的 [[Prototype]]。相反,你应该使用 Object.create()来创建带有你想要的[[Prototype]]的新对象。

Object.getPrototypeOf(obj)

获取一个指定的对象的原型

复制

Object.assign(target, ...sources)

将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。

只进行第一层的深拷贝

其他

Object.is(val1, val2)

与 === 运算符基本一致

区别在于 === 将 -0 和 +0 当作一样 而将 NaN 和 NaN 当作不一样

Last updated

Was this helpful?