We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Symbol.unscopables ウェルノウンシンボルは、関連するオブジェクトの with 環境バインディングから除外される自身および継承したプロパティ名のオブジェクト値を指定するために使用されます。

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

説明

@@unscopables シンボル(Symbol.unscopables)は、with 環境バインディングでレキシカル変数として公開されているプロパティ名を除外するために、任意のオブジェクトで定義できます。Strict モードを使用している場合、with ステートメントは使用不可のため、このシンボルを使う必要がありません。

unscopables オブジェクトでプロパティを true に設定すると、unscopable になります。それゆえ、レキシカルスコープ変数に現れません。プロパティを false に指定すると scopable になりレキシカルスコープ変数に現れます。

次のコードは、ES5 以下であれば正しく動作します。しかし、ECMAScript 2015(ES6)以降では、Array.prototype.keys() メソッドが導入されました。これは、with 環境内で "keys" はメソッドであり変数ではないことを意味します。これが unscopable シンボルを導入すべき時です。ビルトイン unscopables 設定は、配列のメソッドのいくつかが with 環境のスコープに入らないようにするために、Array.prototype[@@unscopables] として実装されています。

var keys = [];

with(Array.prototype) {
  keys.push("something");
}

Object.keys(Array.prototype[Symbol.unscopables]); 
// ["copyWithin", "entries", "fill", "find", "findIndex", 
//  "includes", "keys", "values"]

オブジェクトに対して unscopables を設定することもできます。

var obj = { 
  foo: 1, 
  bar: 2 
};

obj[Symbol.unscopables] = { 
  foo: false, 
  bar: true 
};

with(obj) {
  console.log(foo); // 1
  console.log(bar); // ReferenceError: bar is not defined
}

仕様

仕様 ステータス コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Symbol.unscopables の定義
標準 初期定義。
ECMAScript Latest Draft (ECMA-262)
Symbol.unscopables の定義
ドラフト  

ブラウザ実装状況

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート 未サポート 48 (48) 未サポート 未サポート 未サポート
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート 未サポート 未サポート 48.0 (48) 未サポート 未サポート 未サポート

関連項目

ドキュメントのタグと貢献者

このページの貢献者: YuichiNukiyama
最終更新者: YuichiNukiyama,