html 中怎樣顯示enum,JavaScript如何枚舉?

JavaScript中對象的屬性分為兩種:數據屬性和訪問器屬性。然后根據具體的上下文環境的不同,又可以將屬性分為:原型屬性和實例屬性。原型屬性是定義在對象的原型(prototype)中的屬性,而實例屬性一方面來自構造的函數中,然后就是構造函數實例化后添加的新屬性。

5d68c5eea797c663.jpg

在JavaScript中除了檢測對象的屬性是否存在,還會經常對對象的屬性進行遍歷(枚舉)。而在JavaScript中遍歷一個對象的屬性并不太簡單,主要有兩個原因:

JavaScript中的對象通常都處在某個原型鏈中,它會從一個或多個的上層原型上繼承一些屬性JavaScript中的屬性不光有值,它還有一些除了值以外的其他特性,其中一個影響屬性遍歷的特性就是[[Enumerable]],如果該值為true,則這個屬性是可枚舉的,否則反之

這篇文章將總結有關于JavaScript中對象屬性枚舉的幾種方法:for ... in

Object.keys()

Object.getOwnPropertyNames()

for ... of

for ... in

for...in循環可以遍歷對象中所有可枚舉的對象屬性(包括對象自有屬性和繼承的屬性)。不過需要注意的是,使用for...in循環遍歷對象屬性時返回的屬性會因為各個瀏覽器不同導致對象屬性遍歷的順序有可能不是當初構建時的順序。var obj = {

'x': 1,

'y': 2,

'z': 3

}

obj.propertyIsEnumerable('toString'); // false,不可枚舉

for (prop in obj) {

console.log(prop); // 輸出x,y,z;但不會輸出toString

}

其實for...in操作的主要目的就是遍歷對象的屬性,如果只需要獲取對象的實例屬性(跳過繼承屬性),可以使用hasOwnProperty()進行過濾:for (prop in obj) { if (!obj.hasOwnProperty(prop)) continue; // 跳過繼承屬性}

如此一來,可以這樣來使用for...in循環遍歷對象屬性:(function() {

var getEnumPropertyNames = function(obj) {

if (typeof obj !== 'object') throw TypeError(); // 參數必須是對象

var props = []; // 將要返回的數組

for (var prop in obj) { // 遍歷所有可枚舉的屬性

if (obj.hasOwnProperty(prop)) { //判斷是否是自有屬性

props.push(prop); //將屬性名添加到數組中

}

}

return props; //返回這個數組

}

// 實例化

var obj = {

'x': 1,

'y': 2

}

obj.propertyIsEnumerable('toString') var propertys = getEnumPropertyNames(obj);

console.log(propertys.length); //2

console.log(propertys.join(",")); //x,y

})()

Object.keys()

Object.keys()方法會返回一個由給定對象的所有可枚舉自身屬性的屬性名組成的數組,數組中屬性名的排列順序和使用for...in循環遍歷該對象時返回的順序一致。兩者最大的區別在于for...in還會遍歷出一個對象從其原型鏈上繼承到的可枚舉屬性。

Object.keys() 返回一個所有元素為字符串的數組,其元素來自于從給定的對象上面可直接枚舉的屬性。這些屬性的順序與手動遍歷該對象屬性時的一致。var obj = {

'x': 1,

'y': 2,

'z': 3

}

obj.propertyIsEnumerable('toString');

console.log(Object.keys(obj)); // ["x", "y", "z"]

Object.keys()可以遍歷對象可枚舉的自身屬性。也就是說對象的屬性不是從原型鏈上繼承下來的。

注意:在 ES5 環境,如果傳入的參數不是一個對象,而是一個字符串,那么它會報 TypeError。在 ES6 環境,如果傳入的是一個非對象參數,內部會對參數作一次強制對象轉換,如果轉換不成功會拋出 TypeError。// 在 ES5 環境

Object.keys('foo'); // TypeError: "foo" is not an object

// 在 ES6 環境

Object.keys('foo'); // ["0", "1", "2"]

// 傳入 null 對象

Object.keys(null); // Uncaught TypeError: Cannot convert undefined or null to object

// 傳入 undefined

Object.keys(undefined); // Uncaught TypeError: Cannot convert undefined or null to object

Object.getOwnPropertyNames()

Object.getOwnPropertyNames()方法返回一個由指定對象的所有自身屬性的屬性名(包括不可枚舉屬性)組成的數組,但不會獲取原型鏈上的屬性。該數組對元素是 obj 自身擁有的枚舉或不可枚舉屬性名稱字符串。// 類數組對象var obj = {

0 : "a",

1 : "b",

2 : "c"

};

console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"]

for...of

for...of為ES6新增的方法,主要來遍歷可迭代的對象(包括Array, Map, Set, arguments等),它主要用來獲取對象的屬性值,而for...in主要獲取對象的屬性名。var colors = ['red', 'green', 'blue'];

colors.length = 5;

colors.push('yellow');

for (var i in colors) {

console.log(colors[i]); // red green blue yellow

}

for (var j of colors) {

console.log(j); // red green blue undefined undefined yellow

}

可以看到使用for...of可以輸出包括數組中不存在的值在內的所有值。

其實除了使用for...of直接獲取屬性值外,我們也可以利用Array.prototype.forEach()來達到同樣的目的。var colors = ['red', 'green', 'blue'];

colors.length = 5;

colors.push('yellow');

for (var i in colors) {

console.log(colors[i]); // red green blue yellow

}

for (var j of colors) {

console.log(j); // red green blue undefined undefined yellow

}

總結一下

其實這幾個方法之間的差異主要在屬性是否可可枚舉,是來自己原型,還是實例。

1567147450798755.jpg

想要了解更多相關知識,可訪問 前端學習網站!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454496.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iperf測試網卡性能

Iperf是一個網絡性能測試工具。可以測試TCP和UDP帶寬質量,可以測量最大TCP帶寬,具有多種參數和UDP特性,可以報告帶寬,延遲抖動和數據包丟失 因為產品上確定要要用的PHY是千M的&a…

acrobat 控件可以發布嗎_短視頻可以同時在多個平臺發布嗎?

我們在做自媒體內容創業中,很多人都在做視頻版塊,那么一個短視頻到底能不能多平臺同時發布呢?那么今天,我來分享給大家,希望能夠幫到你解決困惑。1.作品可以多平臺分發:大家不確定是否能多平臺分發&#xf…

紅河學院計算機科學與技術,2016年紅河學院計算機科學與技術專業最低分是多少?...

類似問題答案2016年廈門理工學院計算機類(含計算機科學與技術、網絡工程、空間信息與專業最低分...學校 地 區 專業 年份 批次 類型 分數 廈門理工學院 福建 計算機類(含計算機科學與技術、網絡工程、空間信息與 2016 一批 理科 491 學校 地 區 專業 年份 批次 類型 分數 廈門理…

Flask 第三方組件之 script

Flask Script擴展提供向Flask插入外部腳本的功能,包括運行一個開發用的服務器,一個定制的Python shell,設置數據庫的腳本,cronjobs,及其他運行在web應用之外的命令行任務;使得腳本和系統分開; …

CentOS四種方法自建yum倉庫

將ISO光盤鏡像作為yum本地倉庫(適用于不能聯外網的環境): 1、 禁用所有可用的yum倉庫,為方便演示,直接全部刪除: # cd /etc/yum.repos.d # ls # rm -rf * 2、 創建光盤掛載點,掛載光盤&#x…

python substr_python數據分析-數據對象(一)

Python基本數據類型一般分為:數字、字符串、列表、元組、字典、集合這六種基本數據類型。不可變(3 個):Number(數字)、String(字符串)、Tuple(元組)&#xff…

VLC框架分析

功能部份: VLC媒體播放器的核心是libvlc ,它提供了界面,應用處理功能,如播放列表管理,音頻和視頻解碼和輸出,線程系統。所有libvlc源文件設在的/src目錄及其子目錄: # config/ :從命令行和配置…

html表格里的超鏈接點不了,Excel如何添加和取消超鏈接 Excel超鏈接打不開是怎么回事...

很多用戶在制作excel表格的時候都會添加一些超鏈接,在制作完成后發布到網頁,閱讀者可以通過超鏈接打開指引的網頁或者文件,超鏈接對制作excel表格的用戶有非常大的幫助,雖然添加超鏈接的步驟非常簡單,不過還是有些exce…

yum 安裝apache php mysql

安裝: yum install -y httpd php 查看版本:、 rpm -qa httpd php httpd-2.2.15-54.el6.centos.x86_64 php-5.3.3-48.el6_8.x86_64 修改apache配置文件: vim /etc/httpd/conf/httpd.conf 在#ServerName www.example.com:80行下添加一行 Server…

Python 散點圖線性擬合_機器學習之利用Python進行簡單線性回歸分析

前言:在利用機器學習方法進行數據分析時經常要了解變量的相關性,有時還需要對變量進行回歸分析。本文首先對人工智能/機器學習/深度學習、相關分析/因果分析/回歸分析等易混淆的概念進行區分,最后結合案例介紹如何利用Python進行簡單線性回歸…

Flask 第三方組件之 Migrate

flask-migrate是flask的一個擴展模塊,主要是擴展數據庫表結構的.類似于Django的python manage.py migrate 官方文檔: http://flask-migrate.readthedocs.io/en/latest/ 安裝 pip install flask-migrate 使用舉例 from flask import Flask from flask_sqlalchemy import SQLA…

html section 布局,section標簽的用法

標簽的用法由于昨晚發了一篇文章http://www.zcool.com.cn/article/ZMzA3MzI.html,有一個網友評論問 的用法。所以現在舉例來說明一下:html5引入了標簽,用于描述文檔的結構,它同標簽的意思一樣。但是在特定環境中,兩者又…

清北學堂Day4

(1)第一題 財富(treasure) Time Limit:1000ms Memory Limit:128MB 題目描述 LYK有n個小伙伴。每個小伙伴有一個身高hi。 這個游戲是這樣的,LYK生活的環境是以身高為美的環境,因此在這里的每個人都羨慕比自己身高高的人&#xff…

Falsk session 源碼解析

Falsk框架session請求流程 from flask import Flask # 1. 實例化Flask對象 app Flask(__name__) # 2. 設置路由 app.route(/index) def index(): return "index" if __name__ __main__: # 3. 啟動socket服務端 app.run() # 4. 用戶請求到來 ap…

vlc內部運行機制以及架構分析

VLC架構剖析1. VideoLan簡介1.1 videolan組成Videolan有以下兩部分組成:VLC:一個最主要的部分,它可以播放各種類型的媒體文件和流vlc架構剖析 1. VideoLan簡介 1.1 videolan組成 Videolan有以下兩部分組成: VLC:一個最主要的部分,它可以播放各種類型的媒…

visio中公式太小_visio繪圖中的數據計算

在繪流程圖時,我們有時候會想直接在流程圖上做計算,比如化工設計時精餾塔計算理論塔板數。在VISIO中,實現這個功能還是比較容易,舉一個最簡單的例子。如下圖所示,等號后面的數字可以根據前面的數字變化。實現過程如下&…

Django syncdb mysql error on localhost - (1045, Access denied for user 'ODBC'@'

環境:WINDOWS系統 將數據庫配置 DATABASES { default: { ENGINE: django.db.backends.mysql, HOST: localhost, PORT: 3306, NAME: yunwei, USERNAME: root, PASSWORD: mysql, } } 改為 DATABASES { default: { ENGINE: django.db.backends.mysql, HOST: localhos…

銀行招計算機專業算什么崗,銀行計算機專業崗位全方位分析

黑龍江銀行招聘信息陸續發布,中公教育專家為各位考生提供:銀行計算機專業崗位全方位分析!供大家參考,預祝大家取得好成績,更多黑龍江人民銀行招聘相關資料請關注黑龍江銀行招聘網。金融銀行部門一直是一個朝陽產業&…

【47.92%】【hdu 5763】Another Meaning

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1440 Accepted Submission(s): 690 Problem DescriptionAs is known to all, in many cases, a word has two meanings. Such as “hehe”, which not only mea…

root用戶登錄mysql后新建用戶提示1045錯誤

執行以下命令查看root權限 show grants for rootlocalhost; 如果沒有顯示with grant option,說明是root沒有擁有新建授權用戶的權限(為什么會這樣呢,因為我把userroot and hostlocalhost給刪掉了,然后重新授權all privileges給新建root用戶&a…