数组
如下图,定义一个普通的数组 arr,arr 中包含4个元素。然后,为 arr 添加一个非数字键名的属性 name,一个不可枚举的属性 age,并在原型上添加一个属性 gender。
使用 5 种方式遍历该数组,根据上图,可看到区别如下:
- for...in
可得到数字索引属性、字母索引属性、原型上的属性,无法获取不可枚举属性for...in 得到的数字索引属性为 string 类型
- for...of
只可以得到数字索引的属性值 - arr.keys()
只可以得到数字索引的属性名 - arr.entries()
只可以得到数字索引的属性的键值对 - Object.getOwnPropertyNames(arr)
可以得到数组自身的所有属性,包括不可枚举属性,但是无法获取原型上的属性
对象
如下图,定义一个普通的对象 obj,具有 name 属性。然后,为 obj 添加一个不可枚举属性 age,并在原型上添加一个属性 gender。
使用 3 中方式遍历该对象,可看到区别如下:
- for...in
可得到对象自身、原型上的所有可枚举属性 - Object.keys(obj)
只能得到对象自身上的可枚举属性 - Object.getOwnPropertyNames(obj)
可以得到对象自身上的所有属性,包括不可枚举属性