列舉:是指物件中的屬性可以遍歷出來,再簡單點就是屬性可以列舉出來。
可列舉性決定了這個屬性能否被for…in查詢遍歷到。
js中基本包裝型別的原型屬性是不可列舉的,如object, array, number等,如果你寫出這樣的**遍歷其中的屬性:
var num = new number();
for(var pro in num)
它的輸出結果會是空。這是因為number中內建的屬性是不可列舉的,所以不能被for…in訪問到。
列舉性的作用:
1、for…in
2、object.keys()
3、json.stringify()
那麼什麼樣的屬性是可列舉屬性呢?
1、通過object.defineproperty()方法加的可列舉屬性
enumerable: true 可列舉
let o =
object.defineproperty(o, 'c', )
for (let key in o)
/*輸出*/
// 1
// 2
// 3
console.log(object.keys(o))
// ["a", "b", "c"]
console.log(json.stringify(o))
//
enumerable: false 不可列舉
let o =
object.defineproperty(o, 'c', )
for (let key in o)
/*輸出*/
// 1
// 2
console.log(object.keys(o))
// ["a", "b"]
console.log(json.stringify(o))
//
2、或者通過原型物件繫結的可以列舉屬性(這種列舉型別只有for…in方法可以訪問到)
function person ()
person.prototype.age = 24
let people = new person()
for (let key in people)
/*輸出*/
// lily
// 女
// 4
console.log(object.keys(o)) // ["lily", "女"]
console.log(json.stringify(people)) //
物件的每個屬性都有乙個描述物件(descriptor),用來控制該屬性的行為。object.getownpropertydescriptor
方法可以獲取該屬性的描述物件。
let obj = ;
object.getownpropertydescriptor(obj, 'foo')
//
描述物件的enumerable
屬性,稱為」可列舉性「,如果該屬性為false
,就表示某些操作會忽略當前屬性。
目前,有四個操作會忽略enumerable
為false
的屬性。
這四個操作之中,前三個是 es5 就有的,最後乙個object.assign()
是 es6 新增的。其中,只有for...in
會返回繼承的屬性,其他三個方法都會忽略繼承的屬性,只處理物件自身的屬性。實際上,引入「可列舉」(enumerable
)這個概念的最初目的,就是讓某些屬性可以規避掉for...in
操作,不然所有內部屬性和方法都會被遍歷到。比如,物件原型的tostring
方法,以及陣列的length
屬性,就通過「可列舉性」,從而避免被for...in
遍歷到。
object.getownpropertydescriptor(object.prototype, 'tostring').enumerable
// false
object.getownpropertydescriptor(, 'length').enumerable
// false
上面**中,tostring
和length
屬性的enumerable
都是false
,因此for...in
不會遍歷到這兩個繼承自原型的屬性。
另外,es6 規定,所有 class 的原型的方法都是不可列舉的。
object.getownpropertydescriptor(class }.prototype, 'foo').enumerable
// false
總的來說,操作中引入繼承的屬性會讓問題複雜化,大多數時候,我們只關心物件自身的屬性。所以,盡量不要用for...in
迴圈,而用object.keys()
代替。
es6 一共有 5 種方法可以遍歷物件的屬性。
(1)for...in
for...in
迴圈遍歷物件自身的和繼承的可列舉屬性(不含 symbol 屬性)。
(2)object.keys(obj)
object.keys
返回乙個陣列,包括物件自身的(不含繼承的)所有可列舉屬性(不含 symbol 屬性)的鍵名。
(3)object.getownpropertynames(obj)
object.getownpropertynames
返回乙個陣列,包含物件自身的所有屬性(不含 symbol 屬性,但是包括不可列舉屬性)的鍵名。
(4)object.getownpropertysymbols(obj)
object.getownpropertysymbols
返回乙個陣列,包含物件自身的所有 symbol 屬性的鍵名。
(5)reflect.ownkeys(obj)
reflect.ownkeys
返回乙個陣列,包含物件自身的所有鍵名,不管鍵名是 symbol 或字串,也不管是否可列舉。
以上的 5 種方法遍歷物件的鍵名,都遵守同樣的屬性遍歷的次序規則。
reflect.ownkeys()
// ['2', '10', 'b', 'a', symbol()]
上面**中,reflect.ownkeys
方法返回乙個陣列,包含了引數物件的所有屬性。這個陣列的屬性次序是這樣的,首先是數值屬性2
和10
,其次是字串屬性b
和a
,最後是 symbol 屬性。
js中的列舉和不可列舉
列舉是指物件中的屬性是否可以遍歷出來,再簡單點說就是屬性是否可以以列舉出來。1.for in迴圈可以列舉 遍歷 出物件本身具有的屬性,通過object.defineproperty 方法加的可列舉屬性,或者通過原型物件繫結的可以列舉屬性。function enumer enumer.prototyp...
使用列舉型別的值建立列舉型別
列舉型別中不僅可以宣告列舉的名稱,還可以加入附加的值如下式 public static enum pushtype public string tostring 其中push type sys稱為列舉的name,0則為列舉型別的value,那如何才能根據列舉型別的value獲取列舉型別的例項呢?見下...
C 中列舉型別
列舉型別是一種的值型別,它用於宣告一組命名的常數。1 列舉的宣告 列舉宣告用於宣告新的列舉型別。訪問修辭符 enum 列舉名 基礎型別 基礎型別必須能夠表示該列舉中定義的所有列舉數值。列舉宣告可以顯式地宣告 byte sbyte short ushort int uint long 或 ulong ...