ES6中一共有5种方法可以遍历对象的属性。
- for ... in
for ... in循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)。
<script>
var a = {
name: 'xutong',
age: 7
}
Object.prototype.sex = 'male'
for(let prop in a) {
console.log(prop)
}
//会遍历到sex属性
</script>
- Object.keys(obj)
Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。
var a = {
name: 'xutong',
age: 7
}
Object.prototype.sex = 'male'
console.log(Object.keys(a))
//['name', 'age'] 不包含sex属性
- Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一个数组,包括对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。
- Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一个数组,包括对象自身的所有Symbol属性。
- Reflect.ownKeys(obj)
Reflect.ownKeys返回一个数组,包括对象自身的所有属性,不管属性名是Symbol还是字符串,也不管是否可枚举。
以上五种方法遍历对象的属性时都遵守同样的属性遍历次序规则。
- 首先遍历所有属性名为数值的属性,按照数字排序;
- 其次遍历所有属性名为字符串的属性,按照生成时间排序;
- 最后遍历所有属性名为Symbol值的属性,按照生成时间排序。
在此感谢阮一峰老师的总结与分享!