javascript中enumerable特性由属性描述符控制,决定属性是否在遍历中可见:for...in遍历所有可枚举属性(含原型链);object.keys()、entries()、values()仅返回自有可枚举属性;getownpropertynames()返回所有自有属性(含不可枚举);reflect.ownkeys()返回所有自有属性(含symbol和不可枚举)。

JavaScript 中的 enumerable(可枚举性)是对象属性的一个关键特性,它直接决定该属性是否会在某些遍历操作中被“看到”。这个特性不是凭空存在,而是由属性描述符(property descriptor)中的 enumerable: true/false 控制。不同 API 对它的处理方式差异明显,理解这点能避免遍历时漏掉属性或意外拿到原型链上的内容。
for...in:只看可枚举性,不区分自有/继承
for...in 遍历的是**所有可枚举属性**,无论来自对象自身还是其原型链。只要 enumerable 为 true,就会被遍历到。
- 自有不可枚举属性(如用
Object.defineProperty(obj, 'x', { enumerable: false })定义)——不会出现 - 原型上可枚举属性(如给
Object.prototype添加的普通属性)——会出现 - Symbol 属性——永远不出现(
for...in不处理 Symbol)
Object.keys():自有 + 可枚举
它返回一个数组,只包含对象**自身定义的、且 enumerable 为 true 的属性名**。
- 跳过原型链上的任何属性(哪怕可枚举)
- 跳过不可枚举的自有属性
- 同样忽略 Symbol 键
Object.getOwnPropertyNames():自有 + 全部(不管 enumerable)
这个方法不关心可枚举性,只认“是不是对象自己拥有的”,所以它会列出所有自有属性名,包括 enumerable: false 的。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如通过
Object.defineProperty设置的不可枚举属性会被包含 - 但依然不包含原型属性和 Symbol 键
Object.entries() / Object.values():行为同 Object.keys()
它们底层都依赖 Object.keys() 获取键名,再取值或组装键值对,因此也只处理**自有 + 可枚举**属性。
-
Object.entries(obj)≈Object.keys(obj).map(key => [key, obj[key]]) - 不可枚举属性、原型属性、Symbol 属性均不会出现在结果中
Reflect.ownKeys():自有 + 全部(含 Symbol)
这是目前最“全量”的自有属性获取方式:它返回对象自身所有属性键名,**不管 enumerable,也不管类型(string 或 Symbol)**。
- 包含不可枚举属性
- 包含 Symbol 类型的键(
Object.getOwnPropertyNames()不包含) - 仍不包含原型链上的任何属性
for...of:不支持普通对象,需搭配使用
普通对象默认没有 [Symbol.iterator],所以 for...of 直接用会报错。但你可以用它配合其他 API 来遍历:
-
for (let key of Object.keys(obj))→ 遍历自有可枚举键名 -
for (let val of Object.values(obj))→ 遍历自有可枚举键对应的值 -
for (let [k, v] of Object.entries(obj))→ 遍历自有可枚举键值对
本质上,for...of 的行为由它所迭代的数组(或可迭代对象)决定,而这些数组本身已受 enumerable 规则过滤。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










