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® 2025 Language Specification
# sec-array.prototype-%symbol.unscopables%

ブラウザーの互換性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
[Symbol.unscopables]

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

関連情報