屬性的可枚舉性與不可枚舉性

咱們到MDN上搜索屬性的可枚舉性和全部權javascript

可枚舉屬性是指內部可枚舉標誌(enumerable)設置爲true的屬性,天然不可枚舉屬性便是enumerablefalsehtml

咱們看下JavaScript基本類型和基本類型包裹對象java

基本類型是指非對象且無方法的數據。
JavaScript有6種基本類型:string,number,boolean,null,undefined,symbol
除了null和undefined外,全部基本類型值都有包裹這個基本類型值的等價對象:
String Boolean Number Symbol
JavaScript有7種不一樣類型的值數組

  • 六種 原型 數據類型this

    • Boolean
    • String
    • Number
    • null
    • undefined
    • Symbol
  • Object對象

還有一個概念就是字面量,有如下字面量prototype

  • 數組字面量(Array)
  • 布爾字面量 (Boolean)
  • 浮點數字面量 (Float)
  • 整數 (Int)
  • 對象字面量 (Object)
  • RegExp
  • 字符串字面量 (String)

好了好了扯遠了,爲何說這些呢,拋出問題,以上屬性是否可枚舉呢?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..inObject.keys仍是有區別的,區別就在於使用for...in還會遍歷出對象從原型鏈上繼承來的可枚舉屬性對象

經過Object.defineProperty定義的屬性,該標誌值默認是false, 因此不可枚舉,經過for..inObject.keys()都遍歷不到。繼承

判斷可枚舉屬性與不可枚舉屬性方法
propertyIsEnumerable(): 方法返回一個布爾值,表示指定的自身屬性是否可枚舉。(不包括原型鏈繼承的屬性)

區別如下方法:

使用 for...in迭代,遍歷出自身以及原型鏈上的可枚舉的屬性,經過hasOwnProperty進行篩選能遍歷出自身可枚舉屬性
而使用Object.keys直接遍歷出的自身可枚舉屬性組成的數組
使用getOwnPropertyNames能夠訪問自身可枚舉屬性與不可枚舉屬性

另外,還有大漠的文章參考,對於以上幾個方法介紹的很詳細。對象屬性的枚舉

相關文章
相關標籤/搜索