属性的可枚举性和遍历

可枚举性

对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。

  1. let obj = { foo: 123 };
  2. Object.getOwnPropertyDescriptor(obj, 'foo')
  3. // {
  4. // value: 123,
  5. // writable: true,
  6. // enumerable: true,
  7. // configurable: true
  8. // }

描述对象的enumerable属性,称为”可枚举性“,如果该属性为false,就表示某些操作会忽略当前属性。

目前,有四个操作会忽略enumerablefalse的属性。

  • for...in循环:只遍历对象自身的和继承的可枚举的属性。
  • Object.keys():返回对象自身的所有可枚举的属性的键名。
  • JSON.stringify():只串行化对象自身的可枚举的属性。
  • Object.assign(): 忽略enumerablefalse的属性,只拷贝对象自身的可枚举的属性。

这四个操作之中,前三个是 ES5 就有的,最后一个Object.assign()是 ES6 新增的。其中,只有for...in会返回继承的属性,其他三个方法都会忽略继承的属性,只处理对象自身的属性。实际上,引入“可枚举”(enumerable)这个概念的最初目的,就是让某些属性可以规避掉for...in操作,不然所有内部属性和方法都会被遍历到。比如,对象原型的toString方法,以及数组的length属性,就通过“可枚举性”,从而避免被for...in遍历到。

  1. Object.getOwnPropertyDescriptor(Object.prototype, 'toString').enumerable
  2. // false
  3. Object.getOwnPropertyDescriptor([], 'length').enumerable
  4. // false

上面代码中,toStringlength属性的enumerable都是false,因此for...in不会遍历到这两个继承自原型的属性。

另外,ES6 规定,所有 Class 的原型的方法都是不可枚举的。

  1. Object.getOwnPropertyDescriptor(class {foo() {}}.prototype, 'foo').enumerable
  2. // false

总的来说,操作中引入继承的属性会让问题复杂化,大多数时候,我们只关心对象自身的属性。所以,尽量不要用for...in循环,而用Object.keys()代替。

属性的遍历

ES6 一共有 5 种方法可以遍历对象的属性。

(1)for...in

for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。

(2)Object.keys(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 键,按照加入时间升序排列。
  1. Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 })
  2. // ['2', '10', 'b', 'a', Symbol()]

上面代码中,Reflect.ownKeys方法返回一个数组,包含了参数对象的所有属性。这个数组的属性次序是这样的,首先是数值属性210,其次是字符串属性ba,最后是 Symbol 属性。

es6 属性的可枚举性和遍历相关推荐

  1. es6对象属性的可枚举性

    对象属性的可枚举性 对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为. Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象. let ...

  2. es6 javascript属性的可枚举性

    对象的每个属性都有一个描述对象( Descriptor ),用来控制该属性的行为.Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象. let obj = { ...

  3. js 对象中,可枚举性(enumerable)是什么?

    js 对象中,可枚举性(enumerable)是什么? 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在 for-in 循环之中(除非属性名是一个 Symbol).具体来说,如果一 ...

  4. JavaScript 对象属性 的可枚举属性与不可枚举属性(enumerable:true/false)

    原文章:https://www.cnblogs.com/kongxy/p/4618173.html 在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决 ...

  5. JS获取对象属性的各种方式和区别(自身/原型属性、可枚举/不可枚举)

    对象的属性有自身属性和原型属性之分,自身属性是对象自己的属性,原型属性是存在于原型链上的属性. 可以用Object.prototype.hasOwnProperty()判断是自身属性还是原型属性.(i ...

  6. java实体类中有枚举类型_实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以...

    通常,我们都是在业务层和界面层使用枚举类型,这能够为我们编程带来便利,但在数据访问层,不使用枚举类型,因为很多数据库都不支持,比如我们现在用的SqlServer2008就不支持枚举类型的列,用的时候也 ...

  7. 中的枚举属性函数_Java 枚举:有效应用

    Java 枚举本身的介绍本文就不多说,相关资料很多,本文将讲述些 Java 枚举使用的技巧和注意事项. 枚举属性 Java 枚举除了可以定义常量以外,还可以定义属性.比如很常见的一个星期枚举 publ ...

  8. java enum 定义属性_java enum(枚举)使用详解 + 总结

    enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容: 8. 总结 ...

  9. Qt编写控件属性设计器5-属性中文

    一.前言 在上一篇文章中就提到过,使用qtpropertybrowser来加载属性,对应加载到的属性是英文的,也就是控件类中Q_PROPERTY描述的变量名称,如何变成中文或者其他语言显示呢?这个就需 ...

最新文章

  1. MySQL基础篇:位、字节和字符的关系
  2. 联邦学习:AI大规模落地又一革命性突破
  3. R的一些统计分析包工具
  4. GitHub上一些有用的Repositories
  5. Scala 空返回值Unit
  6. [译][Tkinter 教程02] Message 控件
  7. xcode 开发ios兼容性问题的上下黑边 和 coco2d-x 游戏分辨率适配 ResolutionPolicy::FIXED_WIDTH 都会引起上下黑边问题!!!...
  8. 机器学习实战(十二)降维(PCA、SVD)
  9. 蓬荜生辉的意思是什么?蓬荜生辉用在什么场合?
  10. WPF事件,路由事件
  11. 阶段3 3.SpringMVC·_05.文件上传_1 文件上传之上传原理分析和搭建环境
  12. vba中filedialog用法
  13. Dockerfile文件:使用脚本文件生成镜像
  14. 车牌识别系统 HY-LPR2
  15. Aptana工具介绍
  16. CF1715D 2+ doors 题解
  17. 将一个自然数拆分为N个自然数
  18. 翻译: 2.7. 如何利用帮助文档 深入神经网络 pytorch
  19. 利用Hbuilder + Android Studio 制作安卓APP
  20. No executable file specified.Use the “file“ or “exec-file“ command.

热门文章

  1. so baby come on~~
  2. .Net 自定义应用程序配置 configSections
  3. ios中获取一个唯一的字符串(利用UUID)
  4. SQL Server相关知识
  5. python学习中软件开发知识点_Python 学习知识点总结归纳
  6. SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)
  7. Java:GB18030字节数组与UTF8互转
  8. 聊一聊 RestTemplate
  9. Java使用Redis
  10. CloudStack4.10+GlusterFS4.10测试