前言
我根据阮老师的《ES6标准入门》学习并总结了七种遍历对象的方法,我会将分别介绍这七种方法并进行详细的区分,并将从 属性可枚举性 问题与 遍历方法 两个大方面讲述全文,其中可枚举性是掌握遍历对象之前的的铺垫,请读者耐心学习,掌握遍历对象的七种方法!
属性的可枚举性
为什么要先说属性的可枚举性问题,因为一些方法会根据属性的可枚举型进行操作,其中 遍历 就是一种,遍历的一些方法会忽略掉可枚举属性值为 false 的属性,我知道到这里读者可能会有一些绕圈子:什么叫 可枚举属性值为 false 的属性 ?下面我带大家来一探究竟
对象中的所有属性都具有一个描述对象,对你没有看错,其实在我们看到的一个普通对象中的每一个属性值都包含一对象,即描述对象,它是用来控制属性的行为
let obj = { ? ?name:"猪痞恶霸", ? ?age:20 }
比如上面声明了一个普通的对象,含有 name 与 age 属性,这两个属性都具有一个描述对象,那我们怎么能拿到这个描述对象呢?
来看看这个方法: Object.getOwnPropertyDescriptor() ,它可以拿到指定对象的某属性的描述对象,所以参数有两个,一个是指定对象,一共是指定对象的某属性
Object.getOwnPropertyDescriptor(obj,"name")
如上图,我们拿到了 obj 对象 name 属性的描述对象,描述对象内就包含了我们想知道的东西, enumerable 就是描述对象可枚举属性,那么在这个例子中值为 true ,所以就能解释上面那句看不懂的话: 可枚举属性值为 false 的属性 ,在这里的解释就为: obj 对象内的 name 属性的描述对象内的可枚举属性值为 true 。
遍历对象
for...in
for...in 可以遍历对象的所有可枚举属性,包括对象本身的和对象继承来的属性
let obj = { ? ?name:"ned", ? ?like:"man" } Object.defineProperty(obj, 'age', { ?value: "18", ?enumerable: false }); for(item in obj) { ? ?console.log(item) }
看一看上面的例子,我们使用 Object.defineProperty 的形式来设置对象的描述对象,将其可枚举属性值设为 false ,使用 for...in 遍历,其没有被打印出来
其实 for...in 的特性会导致一个问题,其继承的属性会被遍历到,所以当我们不想要遍历被继承的属性,那么我们就可以使用 Object.keys()
Object.keys()
Object.leys() 方法可以遍历到所有对象本身的可枚举属性,但是其返回值为数组
let obj = { ? ?name:"ned", ? ?like:"man" } Object.keys(obj) // ?['name', 'like']
到这里我们一般是使用 Object.keys() 来代替 for...in 遍历操作,除此之外,为了代替 for...in ,又新增了与 Object.keys() 配套的遍历方法,下面我们来看看
Object.values()
Object.values() 与 Object.keys() 遍历对象的特性是相同的,但是其返回的结构是以遍历的属性值构成的数组
let obj = { ? ?name:"cornd", ? ?age:10 } Object.values(obj) // ['cornd', 10] Object.defineProperty(obj, 'like', { ?value: "coding", ?enumerable: false }); Object.values(obj) // ['cornd', 10]
声明了一个对象,使用 Object.values() 返回对象的所有自身可枚举属性的属性值,通过设置新的属性值并将其描述对象内的 enumerable 设置为 false ,就可以看到 Object.values() 的特性
Object.entries()
Object.entries() 的返回值为 Object.values() 与 Object.keys() 的结合,也就是说它会返回一个嵌套数组,数组内包括了属性名与属性值
let obj = { ? ?name:"cornd", ? ?age:10 } Object.entries(obj) // [['name', 'cornd'],['age', 10]]
其遍历特性与 Object.values() 和 Object.keys() 相同,不再赘述。
Object.getOwnPropertyNames()
其返回结果与 Object.keys() 对应,但是他得特性与其相反,会返回对象得所有属性,包括了不可枚举属性
var arr = []; console.log(Object.getOwnPropertyNames(arr)); // ['length'] Object.getOwnPropertyDescriptor(arr,"length").enumerable // false
上面我声明了一个空数组,而使用 Object.getOwnPropertyNames() 方法,返回了 length ,而length属性的 enumerable 正是 false
Object.getOwnPropertySymbols()
Object.getOwnPropertySymbols() 会返回对象内的所有 Symbol 属性,返回形式依旧是数组,值得注意的是,在对象初始化的时候,内部是不会包含任何 Symbol 属性
let obj = { ? ?name:"obj" } Object.getOwnPropertySymbols(obj) // []
所以我初始化一个对象,通过这个方法返回的是一个空数组
let sym = Symbol() console.log(sym) obj[sym] = "hogskin" Object.getOwnPropertySymbols(obj) // Symbol()
我在后面新建 symbol ,再为上面声明好的对象添加进去,通过遍历得到 Symbol()
Reflect.ownKeys()
Reflect.ownKeys() 返回的是一个大杂烩数组,即包含了对象的所有属性,无论是否可枚举还是属性是symbol,还是继承,将所有的属性返回
let arr = [0,31,2] Reflect.ownKeys(arr) // ['0', '1', '2', 'length']
上面的例子声明了一个数组,返回的是数组下标和 length 属性。
到此这篇关于JavaScript遍历对象的七种方法汇总的文章就介绍到这了,更多相关JS遍历对象内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
查看更多关于JavaScript遍历对象的七种方法汇总的详细内容...