在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对象中的可枚举属性和不可枚举属性相关推荐

  1. JS中的可枚举属性与不可枚举属性的学习以及扩展

    最近在学习对象遍历的方法时总是能看到的两个词,一个是"原型",一个是"枚举属性".一开始感觉自己大概明白"枚举属性"的意思,但是叫我解释却又 ...

  2. Reflect.ownKeys()与Object.keys()区别 以及 JS中的可枚举属性与不可枚举属性

    代码test1: var obj = {} Object.defineProperty(obj, 'method1', {value: function () {alert("Non enu ...

  3. 如何从JavaScript对象中删除项目[重复]

    本文翻译自:How to remove item from a JavaScript object [duplicate] Possible Duplicate: 可能重复: How to remov ...

  4. 如何从JavaScript对象中删除键? [重复]

    本文翻译自:How do I remove a key from a JavaScript object? [duplicate] This question already has an answe ...

  5. 检查键是否存在于JavaScript对象中?

    如何检查JavaScript对象或数组中是否存在特定键? 如果密钥不存在,而我尝试访问它,它将返回false吗? 还是抛出错误? #1楼 它将返回undefined . var aa = {hello ...

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

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

  7. js对象转数组可枚举属性和不可枚举属性

    前言 项目里面很多地方我们需要把数据处理一下才能应用,包括我们拿到的是一个对象,但是我们需要遍历,这个时候就需要把对象转成数组来实现我们的目的了,js对象转数组有几种方法,归纳整理一下- js对象转数 ...

  8. 如何通过其值获取JavaScript对象中的键?

    本文翻译自:How to get a key in a JavaScript object by its value? I have a quite simple JavaScript object, ...

  9. js的可枚举属性与不可枚举属性

    可枚举属性和不可枚举属性什么意思? 在javascript中,对象的属性可以分为可枚举属性和不可枚举属性,它们的属性由enumerable值决定,可枚举属性决定了这个属性能否被for in 遍历到 判 ...

最新文章

  1. iOS下的类似Android的toast提示
  2. MySQL慢查询日志分析(一)
  3. 黑帽与白帽始终有着“差别”
  4. Mac下修改hosts 解决访问github慢的问题
  5. 你对一个程序员有多尊重
  6. CSocketFile类
  7. 项目回顾1-图片上传-form表单还是base64-前端图片压缩
  8. 图解CSS中padding、margin、border的区别及使用
  9. Django学习笔记之Ajax入门
  10. proxool数据库连接池使用方法
  11. 机器学习:使用matlab的fminunc+正则化实现二元逻辑回归
  12. python Copula 模型实现
  13. CUDA编程:笔记1
  14. NI Teststand 2014 64bit 调用python脚本指南
  15. 谷歌浏览器安装stylish插件笔记
  16. LM2596DC -DC模块测试记录
  17. 我国IPTV研究目前已达到全球领先水平
  18. html如何实现文章分类功能,HTML文本自动分类技术的研究与工具的实现
  19. 中国供应链金融行业全景调研与发展战略研究规划报告2022-2028年版
  20. 解决Mac book pro (M1芯片)电脑打开idea卡顿,cpu飙升的问题。

热门文章

  1. 前端刷新当前页面的方法总结
  2. 艾永亮:梅西百货退场,国外百货巨头为何赢了全球输在中国
  3. 域名购买 估价与域名的备案
  4. 倒计时定时器(爆炸定时器)、间隔定时器、通过点击按钮停止定时器、异步执行问题
  5. 使用Apriori实现蔬菜价格涨跌关联分析
  6. y-1.前端优化不完全
  7. 课堂上最搞笑的问题答案
  8. 清洁环保的小型风电滑环基本介绍
  9. 解决Win缺少msvcp110.dll无法启动问题
  10. 暗黑血统2 android,暗黑血统2BT版