Array.prototype[Symbol.unscopables]

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

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

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

解説

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

Array.prototype[Symbol.unscopables] は、上記のプロパティ名をすべて true の値で持つ、空のオブジェクトです。このプロトタイプは null なので、 Object.prototype のプロパティ、例えば toString は偶然にスコープ付けできなくなることはなく、 with 文の中の toString() は引き続き配列の中で呼び出すことができます。

自作オブジェクトに unscopables を設定する方法については、 Symbol.unscopables を見てください。

ECMAScript 2015 以前に書かれた以下のコードで values.push('something') を呼び出すことを考えてみてください。

js
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

関連情報