For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/year/pending/proposal-object-keys-length.md.
  • 简体中文
  • Object.keysLength S2

    提案概览
    提案速览

    该提案引入了 Object.keysLength,这是一个内置方法,返回对象自身可枚举字符串键属性的数量,等同于 Object.keys(obj).length,但不会分配中间数组。它旨在减少内存开销并提高热路径中的性能,因为该模式被频繁使用。

    Note

    以下 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) 返回的集合完全相同,但无需分配中间数组。换句话说:

    Object.keysLength(obj) === Object.keys(obj).length;

    这个范围狭窄的 API 解决了实际中最常见的“计算属性数量”模式:Object.keys(obj).length

    动机

    开发人员经常编写 Object.keys(obj).length 来确定对象拥有多少自有的可枚举字符串键属性。虽然清晰,但这迫使引擎创建一个键数组,却只是为了立即取其 .length,造成了不必要的分配和垃圾回收开销。在热路径以及反复执行此检查的框架和库中,这种成本可能很高。

    提供一种无需生成中间数组即可返回相同信息的内置方法:

    • 避免不必要的分配和 GC 压力,
    • 使意图明确且可读,以及
    • 使引擎能够直接优化常见情况。

    本提案刻意专注于 Object.keys 的确切语义(自有、可枚举、字符串键属性)。更广泛的计数需求(例如,包括符号或不可枚举属性,或选择键类型)由父提案 Object.propertyCount 覆盖。

    提议的 API

    Object.keysLength(target)
    • 参数:target — 使用 ToObject 强制转换(类似于 Object.keys)。传递 nullundefined 会抛出 TypeError
    • 返回值:一个非负整数,等于 Object.keys(target).length

    有关精确算法,请参阅规范

    示例

    基本对象:

    Object.keysLength({}); // 0
    Object.keysLength({ a: 1, b: 2 }); // 2
    Object.keysLength(/./.exec('a')); // 4('0'、'index'、'input'、'groups')

    没有原型的对象:

    const o = { __proto__: null };
    o.x = 1;
    Object.keysLength(o); // 1

    数组和稀疏数组(仅计算存在的索引):

    Object.keysLength([, , 3]); // 1(仅索引 "2" 存在)
    const a = [];
    a[10] = 'x';
    Object.keysLength(a); // 1

    符号不被计数(与 Object.keys 一致):

    const s = Symbol('s');
    const obj = { a: 1, [s]: 2 };
    Object.keysLength(obj); // 1

    不可枚举属性不被计数:

    const obj = { a: 1 };
    Object.defineProperty(obj, 'hidden', { value: true, enumerable: false });
    Object.keysLength(obj); // 1
    Object.keysLength([]); // 0

    原始值像 Object.keys 一样进行强制转换:

    Object.keysLength('abc'); // 3(索引 "0"、"1"、"2")
    Object.keysLength(42); // 0

    错误情况:

    Object.keysLength(null); // 抛出 TypeError
    Object.keysLength(undefined); // 抛出 TypeError

    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 在不改变语义的情况下使这一常见意图变得快速。

    链接