Array.prototype[Symbol.unscopables]

Array.prototype[Symbol.unscopables] 資料屬性由所有 Array 例項共享。它包含 ECMAScript 2015 版本之前未包含在 ECMAScript 標準中的屬性名,並且在 with 語句繫結目的中被忽略。

一個具有下方列出的屬性名且值為 truenull-prototype 物件

Array.prototype[Symbol.unscopables] 的屬性特性
可寫
可列舉
可配置

描述

預設的 Array 屬性,在 with 語句繫結目的中被忽略的有

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 報告了一個 bug(Firefox Bug 883914)。

因此,Array.prototype[Symbol.unscopables] 資料屬性使得 ECMAScript 2015 中引入的 Array 屬性在 with 語句繫結目的中被忽略——允許在 ECMAScript 2015 之前編寫的程式碼繼續按預期工作,而不是中斷。

規範

規範
ECMAScript® 2026 語言規範
# sec-array.prototype-%symbol.unscopables%

瀏覽器相容性

另見