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% |
瀏覽器相容性
載入中…