为什么 Object.groupBy() 返回的对象没有 hasOwnProperty?
数据小陈
结论
Object.groupBy() 返回一个原型为 null 的对象。它不继承 Object.prototype,所以没有 grouped.hasOwnProperty 方法。要检查分组结果是否包含某个自有属性,可以使用 Object.hasOwn(grouped, "dev")。
题中的代码可以按 role 分组,但调用 grouped.hasOwnProperty("dev") 会抛出 TypeError,因为返回对象没有这个方法。
推荐写法
const grouped = Object.groupBy(people, (person) => person.role);
console.log(Object.hasOwn(grouped, "dev")); // true
如果运行环境不支持 Object.hasOwn(),可以改用兼容性较好的写法:
console.log(Object.prototype.hasOwnProperty.call(grouped, "dev")); // true
这两种写法都会检查 "dev" 是否为 grouped 的自有属性,不需要依赖目标对象继承的方法。
为什么返回对象没有原型
回调函数可能返回 "dev"、"pm",也可能返回 "constructor"、"toString" 这类与 Object.prototype 上已有属性同名的字符串。如果结果对象继承了 Object.prototype,这些键就可能与继承的属性混淆。
无原型对象会将分组键直接作为自身属性,避免它们与继承属性冲突。因此,结果对象也不会自动带有常见的对象方法。检查属性时,应使用 Object.hasOwn() 或 Object.prototype.hasOwnProperty.call()。
注意事项
仍然可以用方括号读取 Object.groupBy() 返回结果中的分组数组,例如 grouped["dev"]。这个对象只是没有从 Object.prototype 继承方法。如果业务需要保留任意类型的键,可以考虑使用 Map.groupBy()。它返回 Map,读取分组结果时需要使用 map.get(key) 等 Map API。
备注:内容仅供参考。
