对象枚举属性

本文最后更新于:20 分钟前

对象枚举属性

for/in循环对指定对象的每个可枚举(自有或继承)属性都会运行一次循环体,将属性的名字赋给循环变量。对象继承的内置方法是不可枚举的,但你的代码添加给对象的属性默认是可枚举的。例如:

1
2
3
4
5
6
7
8
9
10
let o={x:1,y:2,z:3}
o.propertyIsEnumerable('toString')

for(let i in o){
console.log(i)
}
// x
// y
// z
//没有toString

为防止通过for/in枚举继承的属性,可以在循环体内添加一个显式测试

1
2
3
4
5
6
7
8
9
10
let o={x:1,y:2,z:3}
o.propertyIsEnumerable('toString')

for(let i in o){
if(!o.hasOwnProperty(i)) continue //跳过继承属性
}

for(let i in o){
if(typeof o[i] === 'function') continue //跳过所有方法
}

除了使用for/in循环,有时候可以先获取对象所有属性名的数组,然后再通过for/of循环遍历该数组。有4个函数可以用来取得属性名数组:

  • Object.keys()返回对象可枚举自有属性名的数组。不包含不可枚举属性、继承属性或名字是符号的属性
  • Object.getOwnPropertyNames()Object.keys()类似,但也会返回不可枚举自有属性名的数组,只要它们的名字是字符串。
  • Object.getOwnPropertySymbols()返回名字是符号的自有属性,无论是否可枚举。
  • Reflect.ownKeys()返回所有属性名,包括可枚举和不可枚举属性,以及字符串属性和符号属性

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!