概述
// 定义一个 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遍历对象注意事项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复