Object.values/Object.entries S4
- 阶段: Stage 4
- 状态: 已完成
- ECMAScript 版本: ES2017
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案向 ECMAScript 添加了 Object.values 和 Object.entries,分别提供对象的自有可枚举值和键值对的数组。它解决了先前只能通过库获得的此类工具函数的常见需求,并与现有的 Object.keys 模式保持一致。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
Object.values / Object.entries
ECMAScript 提案,Object.values/Object.entries 的规范和参考实现
规范由 @ljharb 起草。
该提案目前处于流程的第 4 阶段,并将包含在 ES 2017 中。
指定的 TC39 审阅者:@wycats @littledan @rwaldron
之前的讨论
- TC39 会议记录
- esdiscuss:
- https://esdiscuss.org/topic/object-entries-object-values
- https://esdiscuss.org/topic/es6-iteration-over-object-values
- https://esdiscuss.org/topic/object-values-and-or-object-foreach -> https://esdiscuss.org/topic/iteration-was-re-object-values-and-or-object-foreach
- https://esdiscuss.org/topic/object-entries-in-2015
- https://esdiscuss.org/topic/providing-object-iterators-beyond-just-object-keys
合理性
获取对象自身的值是一个非常常见的用例——例如,当将对象用作哈希过滤器时。许多库都有“values”函数:lodash/underscore、jQuery、Backbone 等。
从对象中获取键/值对(规范中称为“entries”)的数组,对于迭代或序列化也很有用。随着 Map 构造函数接受一个 entries 的可迭代对象,以及其关联的 entries 迭代器(WeakMap 的构造函数也接受可迭代的 entries),通过将 entries 数组传递给 new Map 来快速将普通对象转换为 Map 变得非常有吸引力。
我们已经有 Object.keys 返回自有键数组的先例,并且在 Map/Set/Array 上有匹配的 keys/values/entries 迭代器三元组。因此,根据 es-discuss 上的讨论以及至少一次之前的 TC39 会议,本提案旨在向 ECMAScript 添加 Object.values 和 Object.entries。与 Object.keys 一样,它们将返回数组。它们的顺序将与 Object.keys 的顺序完全一致,这样所有三个结果数组的索引将反映对象上相同的键、值或条目。
规范
您可以查看 markdown 格式的规范,或渲染为 HTML 的形式。
注意:已进行少量规范重构,以确保 Object.{keys,values,entries} 共享相同的键顺序。
迭代器还是数组?
在本提案的观点中,与 Object.keys 的一致性至关重要。然而,一个后续的迭代器提案很可能是 Reflect.ownValues 和 Reflect.ownEntries,这将与 Reflect.ownKeys 一起完成三元组,提供包含字符串值和符号值属性的数组。但是,本提案专注于 Object.values/Object.entries,并且 Object 或 Reflect 形式的存在不应排除另一种形式的存在。此外,目前从 keys/values/entries 返回迭代器的先例仅适用于原型上的方法——而且,“Object 是特殊的”似乎被许多人接受。另外,数组本身已经是可迭代的。