Array.prototype[Symbol.unscopables]
Array.prototype
的 **[Symbol.unscopables]
** 数据属性由所有 Array
实例共享。它包含在 ES2015 版本之前未包含在 ECMAScript 标准中且为 with
语句绑定目的而忽略的属性名称。
值
一个具有如下属性名称且其值设置为 true
的 null
原型对象。
Array.prototype[Symbol.unscopables] 的属性特性 |
|
---|---|
可写 | 否 |
可枚举 | 否 |
可配置 | 是 |
描述
为 with
语句绑定目的而忽略的默认 Array
属性为
at()
copyWithin()
entries()
fill()
find()
findIndex()
findLast()
findLastIndex()
flat()
flatMap()
includes()
keys()
toReversed()
toSorted()
toSpliced()
values()
Array.prototype[Symbol.unscopables]
是一个仅包含所有上述属性名称且其值为 true
的空对象。其 原型为 null
,因此 Object.prototype
属性(如 toString
)不会意外地变得不可作用域,并且 with
语句中的 toString()
将继续在数组上调用。
有关如何为自己的对象设置不可作用域属性,请参阅 Symbol.unscopables
。
示例
假设下面的 values.push('something')
调用位于在 ECMAScript 2015 之前编写的代码中。
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 的浏览器中加载。