Array.prototype[@@unscopables]
@@unscopables
は Array.prototype
のデータプロパティで、すべての Array
インスタンスで共有されます。 ES2015 以前の ECMAScript 標準には含まれておらず、 with
文のバインディングの目的では無視されるプロパティ名を含んでいます。
値
以下の名前で true
に設定された null
プロトタイプオブジェクトです。
Array.prototype[@@unscopables] のプロパティ属性 |
|
---|---|
書込可能 | 不可 |
列挙可能 | 不可 |
設定可能 | 可 |
解説
Array
プロパティのうち、既定で with
文のバインディング目的では無視されるものは次のとおりです。
at()
copyWithin()
entries()
fill()
find()
findIndex()
findLast()
findLastIndex()
flat()
flatMap()
includes()
keys()
toReversed()
toSorted()
toSpliced()
values()
Array.prototype[@@unscopables]
は、上記のプロパティ名をすべて true
の値で持つ、空のオブジェクトです。このプロトタイプは null
なので、 Object.prototype
のプロパティ、例えば toString
は偶然にスコープ付けできなくなることはなく、 with
文の中の toString()
は引き続き配列の中で呼び出すことができます。
自作オブジェクトに unscopables
を設定する方法については、 Symbol.unscopables
を見てください。
例
ECMAScript 2015 以前に書かれた以下のコードで keys.push('something')
を呼び出すことを考えてみてください。
js
var keys = [];
with (Array.prototype) {
keys.push("something");
}
ECMAScript 2015 で Array.prototype.keys()
メソッドが導入されたとき、もし @unscopables
データプロパティも導入されていなければ、 keys.push('something')
の呼び出しは壊れていました。 JavaScript ランタイムが keys
を Array.prototype.keys()
メソッドであると解釈し、この例のコードで定義された配列 keys
とは解釈しませんでした。
すなわち、 @unscopables
データプロパティが Array.prototype
にあるのは、 ECMAScript 2015 で導入された Array
プロパティを with
文のバインドの目的では無視するようにし、 ECMAScript 2015 以前に書かれたコードを壊さず、期待どおりに動作し続けられるようにするものです。
仕様書
Specification |
---|
ECMAScript Language Specification # sec-array.prototype-@@unscopables |
ブラウザーの互換性
BCD tables only load in the browser