Array.prototype[Symbol.unscopables]
[Symbol.unscopables]
は Array.prototype
のデータプロパティで、すべての Array
インスタンスで共有されます。 ES2015 以前の ECMAScript 標準には含まれておらず、 with
文のバインドの目的では無視されるプロパティ名を含んでいます。
値
以下の名前で true
に設定された null
プロトタイプオブジェクトです。
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()
は引き続き配列の中で呼び出すことができます。
自作オブジェクトに unscopables
を設定する方法については、 Symbol.unscopables
を見てください。
例
ECMAScript 2015 以前に書かれた以下のコードで values.push('something')
を呼び出すことを考えてみてください。
var values = [];
with (values) {
values.push("something");
}
ECMAScript 2015 が Array.prototype.values()
メソッドを導入したとき、上記のコードの with
文は、外部の変数 values
ではなく、配列メソッドの values.values
として値を解釈し始めました。values.push('something')
が呼び出されると、これで values.values
メソッドの push
にアクセスすることになるため、エラーが発生します。これにより、Firefox にバグが報告されました(Firefox バグ 883914)。
そのため、Array.prototype
の [Symbol.unscopables]
データプロパティは、with
文のバインドの目的で ECMAScript 2015 で導入された配列プロパティを無視させることになりました。これにより、ECMAScript 2015 より前に書かれたコードは、動作しなくなるのではなく、期待通りに動作し続けることができます。
仕様書
Specification |
---|
ECMAScript Language Specification # sec-array.prototype-%symbol.unscopables% |
ブラウザーの互換性
BCD tables only load in the browser