You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Object.getOwnPropertyDescriptors如何工作?为何返回含'0'与length=1的结果?

问题解答

1. 为什么返回结果包含'0'字段且length值为1?

你代码里调用Object.getOwnPropertyDescriptors时,传的参数是字符串字面量'a',而不是你定义的变量a(那个空对象完全没被用到)。

JavaScript里,当给Object.getOwnPropertyDescriptors传入非对象类型的参数时,会自动执行装箱操作:把原始类型值转换成对应的包装对象。这里字符串'a'会被转换成String类的实例,而字符串包装对象有两个核心特性:

  • 它会将字符串的每个字符以数字索引属性的形式存储,索引从0开始,所以长度为1的字符串'a'就有一个键为'0'的属性,对应的值是字符'a';
  • 自带length属性,值等于原字符串的长度,这里就是1。

另外这些属性的writable和configurable都是false,是因为字符串包装对象的索引属性和length属性都是只读、不可配置的,属于原生内置的固定属性。

2. Object.getOwnPropertyDescriptors的工作机制

这个方法的核心作用是获取目标对象所有自身属性(包括不可枚举属性)的完整属性描述符,具体工作流程如下:

  • 参数预处理:如果传入的参数不是对象,会先进行类型装箱(比如字符串→String对象、数字→Number对象);如果传入null或undefined,会直接抛出错误。
  • 遍历自身属性:遍历目标对象的所有自身属性(注意:只包含对象自己定义的属性,不包括原型链上继承的属性),并且不管属性是否可枚举都会被遍历到。
  • 生成描述符集合:对每个遍历到的属性,获取它的完整属性描述符——如果是数据属性,描述符包含value、writable、enumerable、configurable四个字段;如果是访问器属性,则包含get、set、enumerable、configurable四个字段。最后把这些描述符整理成一个新对象返回,新对象的键是原对象的属性名,值是对应的属性描述符。

举个实际使用的例子,比如获取包含不可枚举属性的对象的所有描述符:

const testObj = {};
// 定义一个不可枚举的属性
Object.defineProperty(testObj, 'nonEnumProp', {
  value: 'test',
  enumerable: false
});
// 获取所有自身属性的描述符
console.log(Object.getOwnPropertyDescriptors(testObj));
// 输出:{ nonEnumProp: { value: 'test', writable: false, enumerable: false, configurable: false } }

内容的提问来源于stack exchange,提问作者Benhao Yu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:05:16