You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Object.defineProperty重定义数组length属性为何抛出不同异常?

为什么Object.defineProperty修改数组length时,字面量属性名和拼接属性名抛出不同异常?

这是完全符合ECMAScript规范的行为,不是JavaScript引擎的实现差异,核心原因在于规范对Object.defineProperty处理数组length属性的逻辑做了明确区分:

  • 直接使用字符串字面量'length'作为属性名时,引擎会触发数组length属性的专属处理逻辑
  • 属性名通过表达式(比如字符串拼接'len'+'gth')计算得到时,引擎会先按普通对象属性的逻辑处理,后续才会识别到这实际是length属性,但此时已经走了不同的校验流程

两段代码的具体分析

  1. 第一段代码(字面量'length')
Object.defineProperty([], 'length', {value: -1, configurable: true});

数组的length属性有严格的语义规则:值必须是一个非负整数,且小于2^32。当用字面量指定'length'时,引擎直接进入这个专属校验逻辑,发现值为-1是无效的数组长度,因此抛出RangeError: Invalid array length——这是规范专门为无效数组长度定义的错误类型。

  1. 第二段代码(拼接得到'length')
Object.defineProperty([], 'len' + 'gth', {value: -1, configurable: true});

这里的属性名是表达式计算结果,引擎首先会把它当作普通属性处理。而数组的length属性默认是不可配置的,即使你在配置项里写了configurable: true,也无法覆盖这个默认特性。当尝试重定义一个不可配置的属性时,就会触发TypeError: Cannot redefine property: length——这是普通属性重定义时的标准错误。

规范依据

ECMAScript规范明确要求:当Object.defineProperty的目标是数组,且属性名是**字符串字面量"length"**时,执行数组length属性的特殊处理流程;如果属性名是其他形式(包括计算得到的字符串),则按照普通对象属性的规则处理。这就导致了两种写法触发不同的校验逻辑,最终抛出不同类型的异常。

内容的提问来源于stack exchange,提问作者Trustable

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:28:10