方法介绍
1、 forin循环:遍历对象自身的和原型链上的可枚举属性,不包括Symbol属性。
2、Object.getOwnPropertySymbols()方法:返回一个数组,仅包含对象自身的所有Symbol类型的属性。也只有这个方法能遍历Symbol属性。
3、 Object.getOwnPropertyNames()方法:返回一个数组,包含对象自身的所有非Symbol属性,无论它们是否可枚举。
4. Object.keys()方法:返回一个数组,包含对象自身(不含原型链上的)的所有非Symbol的可枚举属性。
5. Object.values()方法:返回一个数组,包含对象自身的所有非Symbol的可枚举属性的值。
6. Object.entries()方法:返回一个数组,其元素是对象自身所有非Symbol的可枚举属性键值对数组。
7、forof遍历Object.entries():通过遍历Object.entries(),可以同时拿到属性名和值,特性类似Obejct.entries()
8、forof+遍历实现可迭代协议:让对象实现可迭代协议。【不推荐,因为还要往对象上加东西】
区别说明
这些方法的主要区别在于:
1、 只有Object.getOwnPropertySymbols()能遍历自身的Symbol属性,其他Object的静态方法都只会遍历自身的非Symbol属性,只有Object.getOwnPropertyNames()不关心属性是否可以枚举。
2、 只有forin会遍历自身和原型链上非Symbol的可枚举属性。
测试代码
let s = Symbol('symbol')
// 先定义一个symbol属性和对象自身属性
let obj = {
name: '虾米',
[s]: 'symbol属性'
}
// 再定义一个不可枚举的属性
Object.defineProperty(obj, 'sex', {
configurable: true,
enumerable: false, //不可枚举
writable: true,
value: 11
})
// 最后在原型链上定义一个属性
obj.__proto__.age = 12
// forin
for (let i in obj) {
console.log(i, '// forin');
}
// Object.getOwnPropertyNames()
console.log(Object.getOwnPropertyNames(obj), '// Object.getOwnPropertyNames');
// Object.getOwnPropertySymbols()
console.log(Object.getOwnPropertySymbols(obj),'// Object.getOwnPropertySymbols(obj)');
// Object.keys()
console.log(Object.keys(obj), '// Object.keys()');
// Object.values()
console.log(Object.values(obj), '// Object.values()');
// Object.entries()
console.log(Object.entries(obj), '// Object.entries()');
运行结果: