咱們到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
能夠訪問自身可枚舉屬性與不可枚舉屬性
另外,還有大漠的文章參考,對於以上幾個方法介紹的很詳細。對象屬性的枚舉