Array.prototype[@@unscopables]

@@unscopablesArray.prototype のデータプロパティで、すべての Array インスタンスで共有されます。 ES2015 以前の ECMAScript 標準には含まれておらず、 with 文のバインディングの目的では無視されるプロパティ名を含んでいます。

以下の名前で true に設定された null プロトタイプオブジェクトです。

Array.prototype[@@unscopables] のプロパティ属性
書込可能 不可
列挙可能 不可
設定可能

解説

Array プロパティのうち、既定で with 文のバインディング目的では無視されるものは次のとおりです。

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 ランタイムが keysArray.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

関連情報