JS遍历对象的几种方法
2021-01-01 20:29
标签:reflect get 字符 reac 字符串 应该 适用于 log 包括 几天前一个小伙伴问我 Object.getOwnPropertyNames() 是干什么用的 平时还真没有使用到这个方法,一时不知如何回答 从方法名称来分析,应该是返回的是对象自身属性名组成的数组 那和 Object.keys() 方法不就一样了吗 感觉事情并不这么简单,于是我仔细看了一下这几种遍历对象的方法的区别 for in 循环是最基础的遍历对象的方式,它还会得到对象原型链上的属性 可以看到对象原型上的属性也被循环出来了 在这种情况下可以使用对象的 hasOwnProperty() 方法过滤掉原型链上的属性 这时候原型上的 bar 属性就被过滤掉了 Object.keys() 是 ES5 新增的一个对象方法,该方法返回对象自身属性名组成的数组,它会自动过滤掉原型链上的属性,然后可以通过数组的 forEach() 方法来遍历 另外还有 Object.values() 方法和 Object.entries() 方法,这两方法的作用范围和 Object.keys() 方法类似,因此不再说明 for in 循环和 Object.keys() 方法都不会返回对象的不可枚举属性 如果需要遍历不可枚举的属性,就要用到前面提到的 Object.getOwnPropertyNames() 方法了 Object.getOwnPropertyNames() 也是 ES5 新增的一个对象方法,该方法返回对象自身属性名组成的数组,包括不可枚举的属性,也可以通过数组的 forEach 方法来遍历 ES2015 新增了 Symbol 数据类型,该类型可以作为对象的键,针对该类型 ES2015 同样新增了 Object.getOwnPropertySymbols() 方法 Object.getOwnPropertySymbols() 方法返回对象自身的 Symbol 属性组成的数组,不包括字符串属性 什么都没有,因为该对象还没有 Symbol 属性 Reflect.ownKeys() 方法是 ES2015 新增的静态方法,该方法返回对象自身所有属性名组成的数组,包括不可枚举的属性和 Symbol 属性 广州vi设计公司 http://www.maiqicn.com 我的007办公资源网 https://www.wode007.com 这其中只有 for in 循环会得到对象原型链上的属性,其它方法都只适用于对象自身的属性 ES 语言后续添加的新特性不会对以前的代码产生副作用,比如在 ES2015 之前就存在的 for in 循环,Object.keys() 和 Object.getOwnPropertyNames() 是肯定不会返回 Symbol 属性的 JS遍历对象的几种方法 标签:reflect get 字符 reac 字符串 应该 适用于 log 包括 原文地址:https://www.cnblogs.com/xiaonian8/p/13685396.htmlfor in
// 创建一个对象并指定其原型,bar 为原型上的属性
const obj = Object.create({
bar: ‘bar‘
})
// foo 为对象自身的属性
obj.foo = ‘foo‘
for (let key in obj) {
console.log(obj[key]) // foo, bar
}
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(obj[key]) // foo
}
}
Object.keys
Object.keys(obj).forEach((key) => {
console.log(obj[key]) // foo
})
Object.getOwnPropertyNames
// 创建一个对象并指定其原型,bar 为原型上的属性
// baz 为对象自身的属性并且不可枚举
const obj = Object.create({
bar: ‘bar‘
}, {
baz: {
value: ‘baz‘,
enumerable: false
}
})
obj.foo = ‘foo‘
// 不包括不可枚举的 baz 属性
Object.keys(obj).forEach((key) => {
console.log(obj[key]) // foo
})
// 包括不可枚举的 baz 属性
Object.getOwnPropertyNames(obj).forEach((key) => {
console.log(obj[key]) // baz, foo
})
Object.getOwnPropertySymbols
Object.getOwnPropertySymbols(obj).forEach((key) => {
console.log(obj[key])
})
// 给对象添加一个不可枚举的 Symbol 属性
Object.defineProperties(obj, {
[Symbol(‘baz‘)]: {
value: ‘Symbol baz‘,
enumerable: false
}
})
// 给对象添加一个可枚举的 Symbol 属性
obj[Symbol(‘foo‘)] = ‘Symbol foo‘
Object.getOwnPropertySymbols(obj).forEach((key) => {
console.log(obj[key]) // Symbol baz, Symbol foo
})
Reflect.ownKeys
Reflect.ownKeys(obj).forEach((key) => {
console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo
})
对比
方式
基本属性
原型链
不可枚举
Symbol
for in
是
是
否
否
Object.keys()
是
否
否
否
Object.getOwnPropertyNames()
是
否
是
否
Object.getOwnPropertySymbols()
否
否
是
是
Reflect.ownKeys()
是
否
是
是
结论