in

in 演算子は、指定されたプロパティが指定されたオブジェクトにある場合に true を返します。

構文

prop in object

引数

prop
プロパティ名または配列のインデックスを表す文字列式またはシンボルです(シンボルではない場合は、文字列に強制変換されます)。
object
オブジェクト(またはそのプロトタイプチェーン)に、指定された名前(prop)のプロパティが含まれているかどうかを確認するオブジェクト。

基本的な使い方

次の例で in 演算子の使用法を示します。

// Arrays
let trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
0 in trees        // true を返す
3 in trees        // true を返す
6 in trees        // false を返す
'bay' in trees    // false を返す (インデックスの指す値ではなく、インデックスの数字を指定しなければならない)
'length' in trees // true を返す (length は Array のプロパティ)
Symbol.iterator in trees // true を返す (配列は反復可能。ES2015 以上で動作する)

// 定義済みオブジェクト
'PI' in Math          // true を返す

// ユーザー定義オブジェクト
let mycar = {make: 'Honda', model: 'Accord', year: 1998};
'make' in mycar  // true を返す
'model' in mycar // true を返す

in 演算子の右側には、オブジェクトを指定しなければなりません。例えば、String コンストラクタで作成した文字列は指定できますが、文字列リテラルは指定できません。

let color1 = new String('green');
'length' in color1 // true を返す

let color2 = 'coral';
// エラーが発生 (color2 は String オブジェクトではありません)
'length' in color2 

削除済みあるいは未定義状態のプロパティへの in の使用

delete 演算子で削除されたプロパティについて、in 演算子は false を返します。

let mycar = {make: 'Honda', model: 'Accord', year: 1998};
delete mycar.make;
'make' in mycar;  // false を返す

let trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');
delete trees[3];
3 in trees; // false を返す

undefined を設定しているが削除されていないプロパティについて、in 演算子は true を返します。

let mycar = {make: 'Honda', model: 'Accord', year: 1998};
mycar.make = undefined;
'make' in mycar;  // true を返す
let trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');
trees[3] = undefined;
3 in trees; // true を返す

in 演算子は、空の配列スロットに対して false を返します。直接アクセスしても undefined が返されます。

let empties = new Array(3)
empties[2] // undefined を返す
2 in empties  // false を返す

これを避けるためには、新しい配列が常に空でない値で埋められるようにするか、配列の終わりを超えてインデックスに書き込まないようにします。

let empties = new Array(3).fill(undefined)
2 in empties  // true を返す

継承されたプロパティ

in 演算子は、プロトタイプチェーンのプロパティに対して true を返します。(継承されていないプロパティのみをチェックする場合は、代わりに Object.prototype.hasOwnProperty() を使用してください)。

'toString' in {}  // returns true

仕様

仕様書
ECMAScript (ECMA-262)
Relational Operators の定義

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
inChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 4Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 0.1.100

凡例

完全対応  
完全対応

関連情報