屬性的可列舉性和遍歷

2021-08-16 19:27:25 字數 1328 閱讀 6079

屬性的可列舉性和遍歷

可列舉性

物件的每乙個屬性都有乙個描述物件(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 物件的擴充套件 屬性的可列舉性和遍歷

可列舉 物件的每乙個屬性都有乙個描述物件,用來控制該屬性的行為。object.getownpropertydescriptor 方法可以獲取該屬性的描述物件。let obj object.getownpropertydescriptor obj,foo 描述物件的 enumerable 屬性,稱為 ...

es6 javascript屬性的可列舉性

物件的每個屬性都有乙個描述物件 descriptor 用來控制該屬性的行為。object.getownpropertydescriptor方法可以獲取該屬性的描述物件。let obj object.getownpropertydescriptor obj,foo 描述物件的enumerable屬性,...

enumerable 可列舉 屬性

乙個物件的可列舉屬性會在for.in中被訪問到 或是類似的迭代方法,object.keys 如果乙個屬性不是可列舉的,迴圈會忽略這個屬性 varobj console.log tostring in obj trueconsole.log typeofobj.tostring function fo...