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.mzph.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…