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
列舉物件中的屬性(for....in 方法遍歷物件中的屬性名+屬性值)
<!DOCTYPE html> <html> <head> <m
搭建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.currentTimeMillis及nanoTime原理詳解
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網絡配置之四 ifconfig及ip命令詳解
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>