// 定义一个 person 对象
let person = {
name: '孙悟空',
[Symbol('age')]: 18
}
Object.defineProperties(person, {
skill: {
value: '七十二变',
enumerable: false,
},
[Symbol('birthday')]: {
value: '2021-07-21',
enumerable: false,
}
})
Object.defineProperties(person.__proto__, {
teacher: {
value: '唐僧',
enumerable: true,
},
task: {
value: '西天取经',
enumerable: false,
},
[Symbol('country')]: {
value: '中国',
enumerable: true
},
[Symbol('hometown')]: {
value: '花果山',
enumerable: false,
},
})
浅颜色的属性都是不可枚举的属性,__proto__下的属性则为其原型上(即 Object.prototype)的属性,Symbol 类型的值自然为 Symbol 属性。

for…in
包含自身和原型上所有可枚举属性,但不包含Symbol属性
for(let key in person) {
console.log(key)
}
// name
// teacher
当不需要原型上的属性时
for(let key in person) {
if (person.hasOwnProperty(key)) {
console.log(key)
}
}
// name
Object.keys/Object.values/Object.entries
包含自身所有可枚举属性,但不包含原型上的所有属性和Symbol属性
console.log(Object.keys(person)) // ['name']
console.log(Object.values(person)) // ['孙悟空']
console.log(Object.entries(person)) // [['name', '孙悟空']]
Object.getOwnPropertyNames
包含自身所有属性(包括可枚举和不可枚举),但不包含原型上的所有属性和Symbol属性
console.log(Object.getOwnPropertyNames(person)) // ['name', 'skill']
Object.getOwnPropertySymbols
包含自身所有Symbol属性(包括可枚举和不可枚举),但不包含原型上所有属性
console.log(Object.getOwnPropertySymbols(person)) // [Symbol(age), Symbol(birthday)]
Reflect.ownKeys
包含自身所有属性(包括可枚举、不可枚举和Symbol属性),但不包含原型上所有属性。
console.log(Reflect.ownKeys(person)) // ['name', 'skill', Symbol(age), Symbol(birthday)]
总结
- 只有
for...in可以遍历到对象原型上的属性 - 只有
Object.getOwnPropertySymbols和Reflect.ownKeys能访问到对象上Symbol属性 Object.getOwnPropertyNames、Object.getOwnPropertySymbols和Reflect.ownKeys访问的属性包括可枚举和不可枚举Object.getOwnPropertyNames+Object.getOwnPropertySymbols=Reflect.ownKeys
最后
以上就是美满铃铛最近收集整理的关于js遍历对象注意事项的全部内容,更多相关js遍历对象注意事项内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复