对象属性的可枚举性

对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。

Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。

let obj = {name: 'Tom',age: 26
}console.log(Object.getOwnPropertyDescriptor(obj,'name'))// {//    configurable: true
//    enumerable: true
//    value: "Tom"
//    writable: true
// }

描述对象的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遍历到。

Object.getOwnPropertyDescriptor(Object.prototype, 'toString').enumerable
// falseObject.getOwnPropertyDescriptor([], 'length').enumerable
// false

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

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

class Person {constructor(name,age){this.name = namethis.age = age}showName(){console.log(this.name)}
}console.log(Object.getOwnPropertyDescriptor(Person.prototype,'showName').enumerable)   // false

总的来说,操作中引入继承的属性会让问题复杂化,大多数时候,只关心对象自身的属性。

所以,尽量不要用for...in循环,而用Object.keys()代替。

es6对象属性的可枚举性相关推荐

  1. es6 javascript属性的可枚举性

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

  2. es6 属性的可枚举性和遍历

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

  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. es6对象属性的遍历

    ES6一共有5种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和继承的可枚举属性(不含Symbol属性). (2)Object.keys(obj) Object. ...

  6. java返回属性_java – 根据对象属性确定哪个枚举返回

    我建议你使用简单的继承与不可变对象. 所以,首先你必须创建抽象类: public abstract class AbstractPerson { private final String name; ...

  7. JavaScript服务器端开发技术(对象属性的枚举与查询)

    既然对象是属性的集合,那么检测与枚举集合中的属性就是一项重要任务.对此,我们来分别看一下ES3和ES5提供的解决方案. 1)     ES3枚举方案 示例代码: var contacts={ ID:[ ...

  8. JavaScript对象中的可枚举属性和不可枚举属性

    在JavaScript中,对象的属性有可枚举和不可枚举之分,它是由对象属性描述符enumerable决定的.如果该属性是可枚举性的那么这个属性就能被for-in查找遍历到. 对象的属性描述符 在Jav ...

  9. 深入浅出JS的对象属性

    可能很多人都知道最近很火的MVVM(model-view-virtualModel)框架,如Vue/Angular/React,如果你不知道的话,就要抓紧学习了,它能够把你从高频复杂的DOM解析中解脱 ...

最新文章

  1. 伍六七带你学算法 入门篇——最后一个单词的长度
  2. 【知乎热议】视觉算法的工业部署及落地方面的技术知识,怎么学?
  3. linux系统的5种文件类型及其属性符号
  4. 杂七杂八(1)——如何查看本机的.NET Framework版本
  5. python启动mysql_Python操作MySQL
  6. asp.net学习之再论sqlDataSource
  7. 新天龙官网服务器更新消息,新天龙八部怀旧服太火,增开7组服务器不够用,还得继续扩容...
  8. 全向轮机器人直线运动分析
  9. Django__WSGI
  10. 基于蒙特卡洛模型的排队问题求解
  11. matlab 符号函数 计算,MATLAB符号计算函数用法总结
  12. 洛谷 P1097 统计数字
  13. 又一程序员删库跑路被判刑,切勿冲动
  14. 如何选择家庭私有云NAS方案?家庭NAS存储服务器的重要性
  15. 男人婚后为何会对婚姻心生倦意?
  16. 利用Python3实现:非常“实用”的身高计算器(源代码)
  17. 信号与系统3-傅里叶变换与频域分析
  18. linux svn 查看忽略文件,SVN忽略文件或文件夹几种方法总结linux操作系统 -电脑资料...
  19. cocos2d-x 使用Box2d制作的台球游戏
  20. 图像处理——Fast AutoAugment

热门文章

  1. 用Python定时发送图片到群消息,并艾特了所有人!
  2. conan修改包下载的路径
  3. 含有hashmap的arraylist排序
  4. mysql设置时间默认值
  5. Android 悬浮框按钮
  6. 一套开源的可快速搭建自己的物联网/智能家居系统源码
  7. 瞰见 I 黯然退市的 Cloudera, 让我们开源人情何以堪?
  8. 小龙虾炒菜机器人_10岁男孩用炒菜机器人做烤鱼炸薯条,爸妈和同学直流口水...
  9. 这可能是2020年最值得参加的5G边缘计算会议
  10. 上海python好找工作吗_和嗲妹妹面试python,是种什么体验?