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
相关产品推荐
相关产品推荐

