咱们到MDN上搜索属性的可枚举性和全部权javascript
可枚举属性是指内部可枚举标志(enumerable
)设置为true
的属性,天然不可枚举属性便是enumerable
为false
html
咱们看下JavaScript基本类型和基本类型包裹对象java
基本类型
是指非对象且无方法的数据。JavaScript
有6种基本类型:string,number,boolean,null,undefined,symbol
除了null和undefined
外,全部基本类型值都有包裹这个基本类型值的等价对象
:String
Boolean
Number
Symbol
JavaScript
有7种不一样类型的值数组
六种 原型
数据类型this
Object
对象还有一个概念就是字面量
,有如下字面量prototype
好了好了扯远了,为何说这些呢,抛出问题,以上属性是否可枚举呢?code
下面来看一个例子:htm
function Person() { this.name = 'fyflying' } Person.prototype = { hobby: 'coding' } var person = new Person() Object.defineProperty(person, 'sex', { value: 'female' }) for (var item in person) { console.log(item + ':' + person[item]) } /** name:fyflying hobby:coding **/ Object.keys(person) // ["name"] JSON.stringify(person) //"{"name":"fyflying"}"
能够看到除了sex
属性其余都遍历到了,并且使用for..in
与Object.keys
仍是有区别的,区别就在于使用for...in
还会遍历出对象从原型链上继承来的可枚举属性对象
经过Object.defineProperty
定义的属性,该标志值默认是false
, 因此不可枚举,经过for..in
和 Object.keys()
都遍历不到。继承
判断可枚举属性与不可枚举属性方法:propertyIsEnumerable()
: 方法返回一个布尔值,表示指定的自身属性是否可枚举。(不包括原型链继承的属性)
区别如下方法:
使用 for...in
迭代,遍历出自身以及原型链上的可枚举的属性,经过hasOwnProperty
进行筛选能遍历出自身可枚举属性
而使用Object.keys
直接遍历出的自身可枚举属性组成的数组
使用getOwnPropertyNames
能够访问自身可枚举属性与不可枚举属性
另外,还有大漠的文章参考,对于以上几个方法介绍的很详细。对象属性的枚举