Array.prototype[Symbol.unscopables]

Array.prototype[Symbol.unscopables] 数据属性由所有 Array 实例共享。它包含 ECMAScript 2015 版本之前未包含在 ECMAScript 标准中的属性名,并且在 with 语句绑定目的中被忽略。

一个具有下方列出的属性名且值为 truenull-prototype 对象

Array.prototype[Symbol.unscopables] 的属性特性
可写
可枚举
可配置

描述

默认的 Array 属性,在 with 语句绑定目的中被忽略的有

Array.prototype[Symbol.unscopables] 是一个空对象,只包含所有上述属性名,其值为 true。它的 原型是 null,因此 Object.prototype 的属性(如 toString)不会意外地被设为不可作用域,并且 with 语句中的 toString() 将继续在数组上调用。

请参阅 Symbol.unscopables 来了解如何为自己的对象设置不可作用域属性。

示例

想象下面 `values.push('something')` 的调用是在 ECMAScript 2015 之前编写的代码中。

js
var values = [];

with (values) {
  values.push("something");
}

当 ECMAScript 2015 引入 Array.prototype.values() 方法时,上面代码中的 `with` 语句开始将 `values` 解释为 `values.values` 数组方法,而不是外部的 `values` 变量。`values.push('something')` 调用会中断,因为它现在正在访问 `values.values` 方法的 `push`。这导致 Firefox 报告了一个 bug(Firefox Bug 883914)。

因此,Array.prototype[Symbol.unscopables] 数据属性使得 ECMAScript 2015 中引入的 Array 属性在 with 语句绑定目的中被忽略——允许在 ECMAScript 2015 之前编写的代码继续按预期工作,而不是中断。

规范

规范
ECMAScript® 2026 语言规范
# sec-array.prototype-%symbol.unscopables%

浏览器兼容性

另见