1. 程式人生 > >JavaScriptES6物件之屬性的可列舉性及遍歷詳解

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

目錄

可列舉性

屬性的遍歷

可列舉性

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

let obj = { foo :1};
console.log(Object.getOwnPropertyDescriptor(obj,"foo"));

目前有四個操作會忽略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{ foo(){}}.prototype,"foo").enumerable);    //false

屬性的遍歷

1.for...in

for...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({ [Symbol()] : 0,b : 0, 10 : 0, 2 : 0 , a : 0,});
console.log(queue);         [2,10,b,a,[Symbol()]]

主頁傳送門

相關推薦

JavaScriptES6物件屬性列舉

目錄 可列舉性 屬性的遍歷 可列舉性 物件的每個屬性都有一個描述物件,用來控制該屬性的行為,Object.getOwnPropertyDescriptor方法可以獲取該屬性的描述物件。描述物件的enumerable屬性,稱為可列舉性,如果為true,為可列舉的,如

ES6-物件的擴充套件-屬性列舉

可列舉 物件的每一個屬性都有一個描述物件,用來控制該屬性的行為。Object.getOwnpropertyDescriptor 方法可以獲取該屬性的描述物件。 let obj = { foo: 123 }; Object.getOwnPropertyDescriptor(

JS中物件屬性列舉

在JS中,物件的屬性分為可列舉和不可列舉,它是由屬性的enumerable值決定的,true為可列舉,false為不可列舉 JS中預定義的原型屬性一般是不可列舉的,而自己定義的屬性一般可列舉 可以通過propertyIsEnumerable方法判斷該屬性是否可列舉 屬性的列

js物件中什麼是列舉(enumerable)?

概念 可列舉性(enumerable)用來控制所描述的屬性,是否將被包括在for...in迴圈之中。具體來說,如果一個屬性的enumerable為false,下面三個操作不會取到該屬性。 * for..in迴圈 * Object.keys方法 * JSON.stringif

JS 物件屬性"列舉"

物件屬性可列舉,表示該屬性的值不可修改,可認為該屬性是常量。 如何定義不可列舉的屬性? var obj = {name: 'jack', age:23} Object.defineProperty(obj, 'id', {value : '123', enumerable

js物件列舉

引言 說到列舉,可能很多人都會想到列舉型別,但在javascript物件中有一個屬性為可列舉性,他是什麼呢? 概念 可列舉性(enumerable)用來控制所描述的屬性,是否將被包括在for…in迴圈之中。具體來說,如果一個屬性的enumerable為false,下面三個操作不會取到該屬性。 for…in迴

談面向物件程式設計的替代

面向物件程式設計是基於”事物屬性和方法有共性”的前提下才能最大化發揮其效用的。 如果一個系統中有共性的類不多,無法/沒必要進行抽象,那就不適合使用這一程式設計模型。因為類例項化需要大量運算和記憶體。此時,使用面向過程的語言更合適。面向過程語言中所有方法都是靜態

guxh的python筆記:面向物件屬性

1,類的私有屬性 class Foo: def __init__(self, x): self.x = x 類的屬性在例項化之後是可以更改的: f = Foo(1) print(f.x) # 1 f.x = 2 print(f.x) # 2

判斷物件存活:分析演算法

判斷物件存活,常用的方式是引用計數器:每當物件被一個地方引用,計數器便+1;當引用失效時,計數器-1。當物件的計數器為0時,該物件便是一個不被使用的物件,即“死亡”。引用計數器實現簡單,效率高。然而難以解決物件之間相互迴圈引用的問題(兩個失效物件相互儲存了對方的指標)。故JV

搭建nfs共享存儲服務二nfs服務端配置語法配置實戰

linux1.1.NFS服務端配置文件路徑為: /etc/exports,並且默認為空,需要用戶自行配置。/etc/exports文件配置格式為:NFS共享的目錄 NFS客戶端地址1(參數1,參數2...)客戶端地址2(參數1,參數2)1.NFS共享的目錄:為NFS服務端要共享的實際目錄,要用絕對路徑,如(/

【Vue實戰路】一、Vue-cli全面進階操作。

image 腳本 js基礎 這一 命令執行 bsp row 編譯 服務器 全面的Vue-cli學習,這一篇就夠了! 一、下載 使用vue-cli前,需先安裝node.js,node的安裝就不贅述,不過在此需要註意: 1. node版本需在4.x以上,首推6.x以上版本

JVM源碼分析System.currentTimeMillisnanoTime原理

atime status bin lease col void 奇怪 pro http JDK7

Nginx實戰1.1-1.6 Nginx介紹,安裝配置檔案

1.1 Nginx介紹 HTTP協議發展簡史 加粗  https://coding.net/u/aminglinux/p/nginx/git/blob/master/http/version.md  1991年釋出0.9版,只有GET方法,僅支援html,一個連線一個請求 &n

第11課--11_04_Linux網絡配置四 ifconfigip命令

config linux 在線 自動分配 隨機 隨機生成 內核的功能 conf 而不是 一、備用DNS,主DNS是最快的。當主DNS不在線時才用備用DNS。而不是主DNS解析不出來的時候就。主的解析不出來,備用 的肯定也解析不出來,都是國際聯網的。二、DHCP(dynami

大資料技術學習筆記Hadoop框架基礎3-網站日誌分析MapReduce過程

一、回顧     -》Hadoop啟動方式         -》單個程序             sbin/h

uboot的移植配置編譯過程5

/***********************************************************************************     分析物件:原始碼主Makefile中進行配置時的一個重要的指令碼:mkconfig(MKCO

物件排序 ascii碼排序

cesi:function () { var obj = { coach_id:1, coach_ad_id:12, type:1, token:this.$cookieStore.getCookie( 'token'), time

Android中Canvas繪圖PorterDuffXfermode使用工作原理

概述 類android.graphics.PorterDuffXfermode繼承自android.graphics.Xfermode。在用Android中的Canvas進行繪圖時,可以通過使用PorterDuffXfermode將所繪製的圖形的畫素與Canv

MyEclipse+Maven打執行war包時遇到的一系列問題解決方法

以下是我整個打war包過程時遇到的一些問題以及我用到的解決方案,及時分享出來,給遇到同樣問題的小夥伴們予以借鑑,少走彎路。 先貼出來pom.xml中打war包需要的依賴 <build>