object.keys只返回对象自身且enumerable为true的属性名,与configurable无关;configurable为false仅限制删除或修改属性描述符,不影响枚举。

Object.keys 不关心 configurable 是 true 还是 false,它只看 enumerable。
只要属性是对象自身的、且 enumerable: true,Object.keys 就会返回它的键名;
哪怕 configurable: false,只要 enumerable 没被关掉,它照样出现在结果里。
比如:
const obj = {};
Object.defineProperty(obj, 'hidden', {
value: 'secret',
enumerable: false,
configurable: false
});
Object.defineProperty(obj, 'visible', {
value: 'ok',
enumerable: true,
configurable: false
});
console.log(Object.keys(obj)); // ['visible']
这里 'hidden' 虽然 configurable: false,但因 enumerable: false,被 Object.keys 忽略;
而 'visible' 的 configurable: false 完全不影响 Object.keys —— 它照常列出。
Object.keys 只过滤两类属性
- 继承来的属性(只返回自有属性)
-
enumerable: false的自有属性
它完全不检查 configurable、writable 或 value。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
常见误解澄清
- ❌
configurable: false≠ 属性“隐藏”或“不可见” - ✅
enumerable: false才让属性在Object.keys、for...in、JSON.stringify等中消失 - ⚠️
configurable: false的真正影响是:不能删、不能改描述符(如不能再设enumerable: true),但不影响枚举行为本身
如果你想让某个属性不出现在 Object.keys 中
- 必须设
enumerable: false -
configurable设不设false都没关系(当然设了会更“坚固”,但不是必要条件)
简单说:Object.keys 的开关是 enumerable,不是 configurable。configurable 管的是“能不能动这个属性的定义”,而不是“能不能看到它”。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










