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
可以访问自身可枚举属性与不可枚举属性
另外,还有大漠的文章参考,对于以上几个方法介绍的很详细。对象属性的枚举