JavaScript对象中的可枚举属性和不可枚举属性
在JavaScript中,对象的属性有可枚举和不可枚举之分,它是由对象属性描述符enumerable
决定的。如果该属性是可枚举性的那么这个属性就能被for…in
查找遍历到。
对象的属性描述符 |
在JavaScript中可以通过Object.defineProperty()来为对象设置属性描述符。
从ES5开始,添加了对对象属性描述符的支持。现在JavaScript中支持6种属性描述符:
configurable
:设为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。enumerable
: 设置为true的时候该属性才会出现在对象的枚举属性中。value
: 该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等),默认值undefined
。writable
: 设置为true的时候,value才能被赋值运算符改变。改变。get
: 属性的 getter 函数。当访问该属性时,才会调用此函数,执行时不传入任何参数,但是会传入 this 对象。该函数的返回值会被用作属性的值。默认值undefined
。set
:属性的 setter 函数。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。默认值undefined
。
Object.defineProperty() |
Object.defineProperty(obj, prop, descriptor)
使用Object.defineProperty()
定义属性
通过
Object.defineProperty()
定义的属性,enumerable,configurable,writable这几个值默认为false直接为对象动态添加属性,enumerable,configurable,writable这几个值默认为true
let cat ={name:'猫'}
Object.defineProperty(cat, "sound", {enumerable: false,configurable: false,writable: false,value: "喵喵"
});//对象动态添加属性
cat.age=2
哪些是可枚举属性? |
enumerable:true
的属性即为可枚举属性- 基本包装类型的原型属性都是不可枚举的,如Object, Array, Number等
直观看到可枚举属性 |
谷歌浏览器控制台查看对象属性,深色的属性就是可枚举属性,浅色的属性就是不可枚举属性。
与枚举属性有关的几个方法 |
Object.getOwnPropertyNames()
获取对象自身所有的属性键名,包括可枚举和不可枚举的属性。Object.keys()
获取对象自身的可枚举属性键名,返回键名数组。obj.propertyIsEnumerable()
判断对象实例obj自身的属性是否为可枚举。for...in
遍历对象自身的和原型链上的可枚举的属性。可配合hasOwnProperty()
只获取自身可枚举属性Object.values()
获取对象自身的可枚举属性的值,返回值数组。Object.entries()
获取对象自身的可枚举属性的键值对,每个键值对以数组的形式存储,返回键值对数组集。
以上几个方法除了for...in
外其他的方法都无法遍历到原型链的属性。
Reflect.ownKeys()
获取对象自身所有的属性键名,包括Symbol类型属性Object.getOwnPropertySymbols()
获取对象自身Symbol类型属性
Symbol 作为属性名,遍历对象的时候,该属性不会出现在for...in、for...of
循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()
返回。
属性枚举与否有何用? |
设置为不可枚举后,for...in
就无法获取到对象上对应的属性。比如有些场景下你不希望这个属性被获取到。
JavaScript对象中的可枚举属性和不可枚举属性相关推荐
- JS中的可枚举属性与不可枚举属性的学习以及扩展
最近在学习对象遍历的方法时总是能看到的两个词,一个是"原型",一个是"枚举属性".一开始感觉自己大概明白"枚举属性"的意思,但是叫我解释却又 ...
- Reflect.ownKeys()与Object.keys()区别 以及 JS中的可枚举属性与不可枚举属性
代码test1: var obj = {} Object.defineProperty(obj, 'method1', {value: function () {alert("Non enu ...
- 如何从JavaScript对象中删除项目[重复]
本文翻译自:How to remove item from a JavaScript object [duplicate] Possible Duplicate: 可能重复: How to remov ...
- 如何从JavaScript对象中删除键? [重复]
本文翻译自:How do I remove a key from a JavaScript object? [duplicate] This question already has an answe ...
- 检查键是否存在于JavaScript对象中?
如何检查JavaScript对象或数组中是否存在特定键? 如果密钥不存在,而我尝试访问它,它将返回false吗? 还是抛出错误? #1楼 它将返回undefined . var aa = {hello ...
- js 对象中,可枚举性(enumerable)是什么?
js 对象中,可枚举性(enumerable)是什么? 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在 for-in 循环之中(除非属性名是一个 Symbol).具体来说,如果一 ...
- js对象转数组可枚举属性和不可枚举属性
前言 项目里面很多地方我们需要把数据处理一下才能应用,包括我们拿到的是一个对象,但是我们需要遍历,这个时候就需要把对象转成数组来实现我们的目的了,js对象转数组有几种方法,归纳整理一下- js对象转数 ...
- 如何通过其值获取JavaScript对象中的键?
本文翻译自:How to get a key in a JavaScript object by its value? I have a quite simple JavaScript object, ...
- js的可枚举属性与不可枚举属性
可枚举属性和不可枚举属性什么意思? 在javascript中,对象的属性可以分为可枚举属性和不可枚举属性,它们的属性由enumerable值决定,可枚举属性决定了这个属性能否被for in 遍历到 判 ...
最新文章
- iOS下的类似Android的toast提示
- MySQL慢查询日志分析(一)
- 黑帽与白帽始终有着“差别”
- Mac下修改hosts 解决访问github慢的问题
- 你对一个程序员有多尊重
- CSocketFile类
- 项目回顾1-图片上传-form表单还是base64-前端图片压缩
- 图解CSS中padding、margin、border的区别及使用
- Django学习笔记之Ajax入门
- proxool数据库连接池使用方法
- 机器学习:使用matlab的fminunc+正则化实现二元逻辑回归
- python Copula 模型实现
- CUDA编程:笔记1
- NI Teststand 2014 64bit 调用python脚本指南
- 谷歌浏览器安装stylish插件笔记
- LM2596DC -DC模块测试记录
- 我国IPTV研究目前已达到全球领先水平
- html如何实现文章分类功能,HTML文本自动分类技术的研究与工具的实现
- 中国供应链金融行业全景调研与发展战略研究规划报告2022-2028年版
- 解决Mac book pro (M1芯片)电脑打开idea卡顿,cpu飙升的问题。