js ES6物件之屬性的可列舉性及遍歷詳解

2021-10-09 02:59:10 字數 1976 閱讀 5383

物件的每個屬性都有乙個描述物件,用來控制該屬性的行為,object.getownpropertydescriptor方法可以獲取該屬性的描述物件。描述物件的enumerable屬性,稱為可列舉性,如果為true,為可列舉的,如果為false,就表示某些操作會忽略當前屬性。

目前有四個操作會忽略enumerable為false的屬性。

for…in迴圈

只遍歷物件自身的和繼承的可列舉的屬性

object.keys方法

返回物件自身的可列舉的屬性的鍵名

json.stringify()

只序列物件自身的可列舉的屬性

object.assign()

忽略enumerable為false的屬性,只拷貝物件自身的可列舉的屬性

這四個操作之中,前三個是es5就有的,最後乙個object.assign是es6新增的。其中,只有for…in會返回繼承的屬性,其他三個方法都會忽略繼承的屬性。只處理物件自身的屬性。實際上,引入「可列舉」(enumerable)這個概念的最初的目的,就是讓某些屬性可以規避掉for…in操作,不然所有內部屬性和方法都會遍歷到。

比如:物件原型的tostring方法,以及陣列的length屬性,就通過「可列舉性」,從而避免被for…in遍歷到

console.log(object.getownpropertydescriptor(object.prototype,"tostring").enumerable);       //false

console.log(object.getownpropertydescriptor(,"length").enumerable); //false

另外,es6規定所有class的原型方法都是不可列舉的。

console.log(object.getownpropertydescriptor(class a}.prototype,"foo").enumerable);    //false
1.for…infor…in迴圈遍歷物件自身的和繼承的可列舉屬性(不含 symbol 屬性)。

2.object.key(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 種方法遍歷物件的鍵名,都遵守同樣的屬性遍歷的次序規則。

首先遍歷所有數值鍵,按照數值公升序排列

其次遍歷所有字串鍵,按照加入時間公升序排列

最後遍歷所有symbol鍵,按照加入時間公升序排列

let queue = reflect.ownkeys();

console.log(queue); [2,10,b,a,[symbol()]]

ES6 物件的擴充套件 屬性的可列舉性和遍歷

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

es6 javascript屬性的可列舉性

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

es6物件屬性的遍歷

es6一共有5種方法可以遍歷物件的屬性。1 for.in for.in迴圈遍歷物件自身的和繼承的可列舉屬性 不含symbol屬性 2 object.keys obj object.keys返回乙個陣列,包括物件自身的 不含繼承的 所有可列舉屬性 不含symbol屬性 3 object.getownp...