屬性的可列舉性和遍歷
可列舉性
物件的每乙個屬性都有乙個描述物件(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 物件的擴充套件 屬性的可列舉性和遍歷
可列舉 物件的每乙個屬性都有乙個描述物件,用來控制該屬性的行為。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...