物件的每個屬性都有乙個描述物件,用來控制該屬性的行為,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...