JS 属性的可枚举性与不可枚举性
我们到MDN上搜索属性的可枚举性和所有权
可枚举属性是指内部可枚举标志(enumerable)设置为true的属性,自然不可枚举属性即是enumerable为false
我们看下JavaScript基本类型和基本类型包裹对象
基本类型是指非对象且无方法的数据。
JavaScript有6种基本类型:string,number,boolean,null,undefined,symbol
除了null和undefined外,所有基本类型值都有包裹这个基本类型值的等价对象:String Boolean Number Symbol
JavaScript有7种不同类型的值
六种
原型数据类型Boolean
String
Number
null
undefined
Symbol
Object对象
还有一个概念就是字面量,有以下字面量
数组字面量(Array)
布尔字面量 (Boolean)
浮点数字面量 (Float)
整数 (Int)
对象字面量 (Object)
RegExp
字符串字面量 (String)
好了好了扯远了,为什么说这些呢,抛出问题,以上属性是否可枚举呢?
下面来看一个例子:
1 | function Person() { |
可以看到除了sex属性其他都遍历到了,而且使用for..in与Object.keys还是有区别的,区别就在于使用for...in还会遍历出对象从原型链上继承来的可枚举属性
通过Object.defineProperty定义的属性,该标志值默认是false, 所以不可枚举,通过for..in 和 Object.keys()都遍历不到。
判断可枚举属性与不可枚举属性方法:propertyIsEnumerable(): 方法返回一个布尔值,表示指定的自身属性是否可枚举。(不包括原型链继承的属性)
区别以下方法:
使用 for...in迭代,遍历出自身以及原型链上的可枚举的属性,通过hasOwnProperty进行筛选能遍历出自身可枚举属性
而使用Object.keys直接遍历出的自身可枚举属性组成的数组
使用getOwnPropertyNames可以访问自身可枚举属性与不可枚举属性
另外,还有大漠的文章参考,对于以上几个方法介绍的很详细。对象属性的枚举