TypeError: cannot use 'in' operator to search for 'x' in 'y'

JavaScript の例外 "right-hand side of 'in' should be an object" は、 in 演算子が文字列、数値、その他のプリミティブ型の中を検索するために使用された場合に発生します。これは、あるプロパティがオブジェクト内にあることをチェックする用途でしか使用することができません。

メッセージ

TypeError: Invalid operand to 'in' (Edge)
TypeError: right-hand side of 'in' should be an object, got 'x' (Firefox)
TypeError: cannot use 'in' operator to search for 'x' in 'y' (Firefox, Chrome)

エラー種別

TypeError

原因

in 演算子はあるプロパティがオブジェクト内にあることをチェックする用途でしか使用することができません。文字列、数値、その他のプリミティブ型の中を検索することはできません。

文字列内の検索

他のプログラミング言語 (Python など) とは異なり、 in 演算子を使用して文字列の中を検索することはできません。

"Hello" in "Hello World";
// TypeError: cannot use 'in' operator to search for 'Hello' in 'Hello World'

Instead you will need to use String.prototype.indexOf(), for example.

"Hello World".indexOf("Hello") !== -1;
// true

オペランドを null や undefined にすることはできない

調査対象のオブジェクトが実際に nullundefined になっていないことを確認してください。

var foo = null;
"bar" in foo;
// TypeError: cannot use 'in' operator to search for 'bar' in 'foo' (Chrome)
// TypeError: right-hand side of 'in' should be an object, got null (Firefox)

in 演算子は常にオブジェクトを期待します。

var foo = { baz: "bar" };
"bar" in foo; // false

"PI" in Math; // true
"pi" in Math; // false

配列の中の検索

in 演算子を使用して Array オブジェクトの中を検索するときは注意してください。 in 演算子は添字の数値をチェックするのであり、その位置の値をチェックするのではありません。

var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
3 in trees; // true
"oak" in trees; // false

関連情報