Array.prototype[Symbol.unscopables]
Array.prototype 的 [Symbol.unscopables] 数据属性由所有 Array 实例共享。它包含 ECMAScript 2015 版本之前未包含在 ECMAScript 标准中的属性名,并且在 with 语句绑定目的中被忽略。
值
一个具有下方列出的属性名且值为 true 的 null-prototype 对象。
Array.prototype[Symbol.unscopables] 的属性特性 | |
|---|---|
| 可写 | 否 |
| 可枚举 | 否 |
| 可配置 | 是 |
描述
默认的 Array 属性,在 with 语句绑定目的中被忽略的有
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 报告了一个 bug(Firefox Bug 883914)。
因此,Array.prototype 的 [Symbol.unscopables] 数据属性使得 ECMAScript 2015 中引入的 Array 属性在 with 语句绑定目的中被忽略——允许在 ECMAScript 2015 之前编写的代码继续按预期工作,而不是中断。
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-array.prototype-%symbol.unscopables% |
浏览器兼容性
加载中…