lq782655835 / blogs

personal blogs
https://lq782655835.github.io/blogs
330 stars 56 forks source link

ES6-Object #34

Open lq782655835 opened 5 years ago

lq782655835 commented 5 years ago

Object是js最重要的数据结构,es6对其进行了重大升级。除了解构外,Object还提供了大量的基础方法。另外Object对象属性及其方法太常用,有些相似的方法容易使用错误,故根据MDN归类整理。注意文中重点标注的文字以及角标标注的ES发布版本。

Key/Value

Object.keys(obj)ES5

该方法返回一个给定对象的自身可枚举属性组成的数组。

只列出自身的枚举属性

Object.values(obj)ES8

该方法返回一个给定对象自身的所有可枚举属性值的数组

只列出自身的枚举属性值

Object.entries(obj)ES8

该方法返回一个给定对象自身可枚举属性的键值对数组。

只列出自身枚举的键值对数组。

Object.fromEntries()Stage 3是其逆方法,把键值对列表转换为一个对象.

Object.getOwnPropertyNames(obj)

该方法返回一个数组,该数组对元素是 obj自身拥有的枚举或不可枚举属性名称字符串

自身的枚举和不枚举属性都会列出

for ... in

for...in语句以任意顺序遍历一个对象的可枚举属性(包括原型链上的可枚举属性)。包括原型链上的可枚举属性。

自身和原型链上的属性

Descriptor

Object.defineProperty(obj, prop, descriptor)

该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

Object.getOwnPropertyDescriptor()返回对象对应的属性描述符。

Object.defineProperties(obj, props)

该方法直接在一个对象上定义一个或多个新的属性或修改现有属性,并返回该对象。

Object.getOwnPropertyDescriptors()ES8返回对象所有属性描述符。该方法引入目的是为了解决Object.assign()无法正确拷贝get属性和set属性的问题,详见此

Other

Object.assign(target, ...sources)ES6

该方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

翻看源码能知道,它是一层浅拷贝

Object. is(value1, value2)ES6

该方法判断两个值是否是相同的值。

解决ES5中只有===和==判断的不足Equality comparisons and sameness

Object.freeze(obj)Stage 1

该方法可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。目前该方法在tc39 Stage1阶段,兼容性需要看后续发展。

Object.isFrozen(obj)判断一个对象是否被冻结

参考文档: