前端知库

Object.keys、for...in 和 Reflect.ownKeys 会返回哪些属性?

参考答案

Object.keys 返回对象自身、可枚举的字符串属性键;for...in 还会遍历继承链上的可枚举字符串键;Reflect.ownKeys 包含自身的字符串键与 Symbol 键,不限于可枚举属性。

JavaScript
const key = Symbol('内部标记');
const object = Object.create({ inherited: 1 });
object.visible = 2;
Object.defineProperty(object, 'hidden', { value: 3 });
object[key] = 4;
console.log(Object.keys(object).join(',')); // 输出:visible
console.log(Reflect.ownKeys(object).length); // 输出:3
console.log(Object.hasOwn(object, 'inherited')); // 输出:false

遍历输入对象前应先明确需要的是记录字段还是包含继承的属性集合,避免把原型属性误当作用户数据。属性描述符、Symbol 和属性顺序都有规则,序列化或复制操作不能被当作完整保留对象语义的通用方案。