js中的列舉型別和不可列舉型別

2021-09-28 23:30:07 字數 3597 閱讀 6954

列舉:是指物件中的屬性可以遍歷出來,再簡單點就是屬性可以列舉出來。

可列舉性決定了這個屬性能否被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,就表示某些操作會忽略當前屬性。

目前,有四個操作會忽略enumerablefalse的屬性。

這四個操作之中,前三個是 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

上面**中,tostringlength屬性的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方法返回乙個陣列,包含了引數物件的所有屬性。這個陣列的屬性次序是這樣的,首先是數值屬性210,其次是字串屬性ba,最後是 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 ...