Array.prototype[Symbol.unscopables]

Array.prototype[Symbol.unscopables] 数据属性被所有 Array 实例共享。它包含在 ES2015 版本之前 ECMAScript 标准中未收纳的属性名,并且这些属性被排除在由 with 语句绑定的环境中。

一个 null 原型对象,包含下面给出的属性名称,且它们的值都设置为 true

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

描述

with 语句绑定中未包含的 Array 默认属性包括:

Array.prototype[Symbol.unscopables] 是一个只包含所有上述属性且对应值为 true 的空对象。它的原型是 null,因此不会意外地使 Object.prototype 属性(比如 toString)变为不可绑定作用域属性,而令在 with 语句中调用数组的 toString() 方法仍然有效。

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

示例

假设下面的 keys.push('something') 是在 ECMAScript 2015 之前编写的代码中调用的。

js
var keys = [];

with (Array.prototype) {
  keys.push("something");
}

当 ECMAScript 2015 引入 Array.prototype.keys() 方法时,如果 [Symbol.unscopables] 数据属性也没有被引入,那么 keys.push('something') 调用将会出现问题——因为 JavaScript 运行时会将 keys 解释为 Array.prototype.keys() 方法,而不是示例代码中定义的 keys 数组。

因此,Array.prototype[Symbol.unscopables] 数据属性使得 ECMAScript 2015 中引入的 Array 属性在 with 语句绑定时被忽略,从而使得在 ECMAScript 2015 之前编写的代码继续按预期工作,而不会出现问题。

规范

Specification
ECMAScript® 2025 Language Specification
# sec-array.prototype-%symbol.unscopables%

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
[Symbol.unscopables]

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

参见