es6对象属性的可枚举性
对象属性的可枚举性
对象的每个属性都有一个描述对象(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
,就表示某些操作会忽略当前属性。
目前,有四个操作会忽略enumerable
为false
的属性。
for...in
循环:只遍历对象自身的和继承的可枚举的属性。Object.keys()
:返回对象自身的所有可枚举的属性的键名。JSON.stringify()
:只串行化对象自身的可枚举的属性。Object.assign()
: 忽略enumerable
为false
的属性,只拷贝对象自身的可枚举的属性。
这四个操作之中,前三个是 ES5 就有的,最后一个Object.assign()
是 ES6 新增的。
其中,只有for...in
会返回继承的属性,其他三个方法都会忽略继承的属性,只处理对象自身的属性。
实际上,引入“可枚举”(enumerable
)这个概念的最初目的,就是让某些属性可以规避掉for...in
操作,不然所
有内部属性和方法都会被遍历到。比如,对象原型的toString
方法,以及数组的length
属性,就通过“可枚举
性”,从而避免被for...in
遍历到。
Object.getOwnPropertyDescriptor(Object.prototype, 'toString').enumerable
// falseObject.getOwnPropertyDescriptor([], 'length').enumerable
// false
上面代码中,toString
和length
属性的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对象属性的可枚举性相关推荐
- es6 javascript属性的可枚举性
对象的每个属性都有一个描述对象( Descriptor ),用来控制该属性的行为.Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象. let obj = { ...
- es6 属性的可枚举性和遍历
属性的可枚举性和遍历 可枚举性 对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为.Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象 ...
- js 对象中,可枚举性(enumerable)是什么?
js 对象中,可枚举性(enumerable)是什么? 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在 for-in 循环之中(除非属性名是一个 Symbol).具体来说,如果一 ...
- JavaScript 对象属性 的可枚举属性与不可枚举属性(enumerable:true/false)
原文章:https://www.cnblogs.com/kongxy/p/4618173.html 在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决 ...
- es6对象属性的遍历
ES6一共有5种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和继承的可枚举属性(不含Symbol属性). (2)Object.keys(obj) Object. ...
- java返回属性_java – 根据对象属性确定哪个枚举返回
我建议你使用简单的继承与不可变对象. 所以,首先你必须创建抽象类: public abstract class AbstractPerson { private final String name; ...
- JavaScript服务器端开发技术(对象属性的枚举与查询)
既然对象是属性的集合,那么检测与枚举集合中的属性就是一项重要任务.对此,我们来分别看一下ES3和ES5提供的解决方案. 1) ES3枚举方案 示例代码: var contacts={ ID:[ ...
- JavaScript对象中的可枚举属性和不可枚举属性
在JavaScript中,对象的属性有可枚举和不可枚举之分,它是由对象属性描述符enumerable决定的.如果该属性是可枚举性的那么这个属性就能被for-in查找遍历到. 对象的属性描述符 在Jav ...
- 深入浅出JS的对象属性
可能很多人都知道最近很火的MVVM(model-view-virtualModel)框架,如Vue/Angular/React,如果你不知道的话,就要抓紧学习了,它能够把你从高频复杂的DOM解析中解脱 ...
最新文章
- 伍六七带你学算法 入门篇——最后一个单词的长度
- 【知乎热议】视觉算法的工业部署及落地方面的技术知识,怎么学?
- linux系统的5种文件类型及其属性符号
- 杂七杂八(1)——如何查看本机的.NET Framework版本
- python启动mysql_Python操作MySQL
- asp.net学习之再论sqlDataSource
- 新天龙官网服务器更新消息,新天龙八部怀旧服太火,增开7组服务器不够用,还得继续扩容...
- 全向轮机器人直线运动分析
- Django__WSGI
- 基于蒙特卡洛模型的排队问题求解
- matlab 符号函数 计算,MATLAB符号计算函数用法总结
- 洛谷 P1097 统计数字
- 又一程序员删库跑路被判刑,切勿冲动
- 如何选择家庭私有云NAS方案?家庭NAS存储服务器的重要性
- 男人婚后为何会对婚姻心生倦意?
- 利用Python3实现:非常“实用”的身高计算器(源代码)
- 信号与系统3-傅里叶变换与频域分析
- linux svn 查看忽略文件,SVN忽略文件或文件夹几种方法总结linux操作系统 -电脑资料...
- cocos2d-x 使用Box2d制作的台球游戏
- 图像处理——Fast AutoAugment