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 Language Specification
# sec-array.prototype-%symbol.unscopables%

浏览器兼容性

BCD tables only load in the browser

参见