可枚举性(enumerable)用来控制所描述的属性,是否将被包括在for...in循环之中。具体来说,如果一个属性的enumerable为false,下面三个操作不会取到该属性。
* for..in循环  :只遍历对象自身的和继承的可枚举的属性
* Object.keys方法 :返回对象自身的所有可枚举的属性的键名
* JSON.stringify方法:只串行化对象自身的可枚举的属性

* Object.assign()(ES6):只拷贝对象自身的可枚举的属性

这四个操作之中,只有for...in会返回继承的属性。至于for...in循环和Object.keys方法的区别,在于前者包括对象继承自原型对象的属性,而后者只包括对象本身的属性。如果需要获取对象自身的所有属性,不管enumerable的值,可以使用Object.getOwnPropertyNames方法

例子:

var o = {a:1, b:2};

o.c = 3;
Object.defineProperty(o, 'd', {
value: 4,
enumerable:
false
}); o.d
// 4 for( var key in o ) console.log( o[key] ); // 遍历获取对象的属性值 
//
1// 2
// 3 Object.keys(o) // ["a", "b", "c"] (获取对象的属性名) JSON.stringify(o) "{a:1,b:2,c:3}" (把对象转换成为字符串)
上面代码中,d属性的enumerable为false,所以一般的遍历操作都无法获取该属性,使得它有点像“秘密”属性,但还是可以直接获取它的值。 实际上,引入enumerable的最初目的,就是让某些属性可以规避掉for...in操作。比如,对象原型的toString方法,以及数组的length属性,就通过这种手段,不会被for...in遍历到。
Object.getOwnPropertyDescriptor(Object.prototype, 'toString').enumerable
// false Object.getOwnPropertyDescriptor([], 'length').enumerable
// false
上面代码中,toStringlength属性的enumerable都是false,因此for...in不会遍历到这两个继承自原型的属性。 另外,ES6规定,所有Class的原型的方法都是不可枚举的。
Object.getOwnPropertyDescriptor(class {foo() {}}.prototype, 'foo').enumerable
// false
总的来说,操作中引入继承的属性会让问题复杂化,大多数时候,我们只关心对象自身的属性。所以,尽量不要用for...in循环,而用Object.keys()代替。




最新文章

  1. Windows 8 下离线安装。net Framework 3.5
  2. [Java] Java反射
  3. js 创建 JSON对象
  4. 国内第一部C#.Net调用Matlab混合编程视频教程
  5. VS2013 未找到与約束ContractName
  6. JS实时定位
  7. 【XLL API 函数】xlAbort
  8. 4、Type fundamentals
  9. Linux命令(2)-rm删除文件
  10. phpexcel 导入导出
  11. 【125】固定IP的电脑配置无线路由
  12. Tomcat7.0设置虚拟文件夹
  13. Javascript多线程引擎(八)
  14. 【JavaScript创建对象】
  15. Kubernetes因限制内存配置引发的错误
  16. VirtualBox中CentOS7.2 网络配置(固定IP+联网)
  17. org.activiti.engine.activitiexception:version of activiti database(5.22) is more recent than the engine(5.12)
  18. fiddler抓取https请求
  19. 一、JAVA变量类型:②局部变量
  20. 解决eclipse高版本JDK编译的项目到低版本JDK服务器上不能运行的问题

热门文章

  1. 安装coreseek与sphinx遇见的问题
  2. Thread和Runable的区别、Synchronized锁关键字
  3. Scala学习笔记(1)-基本类型归纳
  4. Time Profiler Instrument分析卡顿
  5. .NET基于分页控件实现真分页功能
  6. 深入浅出 TCP/IP 协议栈
  7. python 使用set对列表去重,并保持列表原来顺序
  8. Ubuntu Kylin 14.04 安装配置 jdk、eclipse、tomcat 通用
  9. Netty In Action中文版 - 第三章:Netty核心概念
  10. 从MySQL开发规范处看创业