Array.prototype[Symbol.unscopables]

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

一个具有如下属性名称且其值设置为 truenull 原型对象

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

描述

with 语句绑定目的而忽略的默认 Array 属性为

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 报告了一个错误(Firefox 错误 883914)。

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

规范

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

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅