Object.keysLength S2
- 阶段: Stage 2
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
该提案引入了 Object.keysLength,这是一个内置方法,返回对象自身可枚举字符串键属性的数量,等同于 Object.keys(obj).length,但不会分配中间数组。它旨在减少内存开销并提高热路径中的性能,因为该模式被频繁使用。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
ECMAScript 提案:Object.keysLength
注意:此提案是从更广泛的 Object Property Counting 工作中拆分出来的。
有关更广泛的讨论以及一个计算不同类型自有属性的更通用 API,请参阅父提案:https://github.com/tc39/proposal-object-property-count
状态
您可以在 https://tc39.es/proposal-object-keys-length/ 浏览规范文本,或查看源文件。
概述
Object.keysLength(target) 返回对象自身可枚举字符串键属性的数量——与 Object.keys(target) 返回的集合完全相同,但无需分配中间数组。换句话说:
这个范围狭窄的 API 解决了实际中最常见的“计算属性数量”模式:Object.keys(obj).length。
动机
开发人员经常编写 Object.keys(obj).length 来确定对象拥有多少自有的可枚举字符串键属性。虽然清晰,但这迫使引擎创建一个键数组,却只是为了立即取其 .length,造成了不必要的分配和垃圾回收开销。在热路径以及反复执行此检查的框架和库中,这种成本可能很高。
提供一种无需生成中间数组即可返回相同信息的内置方法:
- 避免不必要的分配和 GC 压力,
- 使意图明确且可读,以及
- 使引擎能够直接优化常见情况。
本提案刻意专注于 Object.keys 的确切语义(自有、可枚举、字符串键属性)。更广泛的计数需求(例如,包括符号或不可枚举属性,或选择键类型)由父提案 Object.propertyCount 覆盖。
提议的 API
- 参数:
target— 使用ToObject强制转换(类似于Object.keys)。传递null或undefined会抛出TypeError。 - 返回值:一个非负整数,等于
Object.keys(target).length。
有关精确算法,请参阅规范。
示例
基本对象:
没有原型的对象:
数组和稀疏数组(仅计算存在的索引):
符号不被计数(与 Object.keys 一致):
不可枚举属性不被计数:
原始值像 Object.keys 一样进行强制转换:
错误情况:
与 Object.propertyCount 的关系
Object.keysLength 是更大的 Object.propertyCount 提案的一个重点子集。Object.keysLength 固定为匹配 Object.keys 的语义(自有、可枚举、字符串键属性),而 Object.propertyCount 探索了一种灵活的 API,还可以通过选项计算符号和/或不可枚举属性。如果您的用例需要这些功能,请参阅父提案:https://github.com/tc39/proposal-object-property-count。
先前实践和使用情况
Object.keys(obj).length 模式在跨框架和库(例如,React、Angular、Vue、Lodash、Node.js、Storybook、VS Code 等)的生产代码库中无处不在。此 API 在不改变语义的情况下使这一常见意图变得快速。