Array.prototype[Symbol.unscopables]
Array.prototype 的 [Symbol.unscopables] 数据属性被所有 Array 实例共享。它包含在 ES2015 版本之前 ECMAScript 标准中未收纳的属性名,并且这些属性被排除在由 with 语句绑定的环境中。
值
一个 null 原型对象,包含下面给出的属性名称,且它们的值都设置为 true。
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 了解如何为自定义对象设置不可绑定作用域属性。
示例
假设下面的 keys.push('something') 是在 ECMAScript 2015 之前编写的代码中调用的。
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® 2026 Language Specification> # sec-array.prototype-%symbol.unscopables%> |
浏览器兼容性
Loading…