JavaScript!instanceof ifステートメント


186

これは本当に私の好奇心を満たすための本当に基本的な質問ですが、次のようなことをする方法があります:

if(obj !instanceof Array) {
    //The object is not an instance of Array
} else {
    //The object is an instance of Array
}

ここでの鍵はNOTを使用できることです!インスタンスの前。通常、これを設定する方法は次のとおりです。

if(obj instanceof Array) {
    //Do nothing here
} else {
    //The object is not an instance of Array
    //Perform actions!
}

そして、オブジェクトが特定のタイプかどうかを知りたいだけのときにelseステートメントを作成しなければならないのは少し面倒です。

回答:


356

括弧で囲み、外側を否定します。

if(!(obj instanceof Array)) {
    //...
}

この場合、優先順位が重要です(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence)。!演算子はinstanceof演算子の前にあります。


9
@ hrishikeshp19-私はあなたが括弧が必要だと確信しています、私はちょうどそれをクロム、IE、ノードで試して、そして各ホストがそれらを必要としました。
マーカスポープ

1
@ riship89かっこが必要です、証明:!! obj instanceof Arrayfalse(正しくない)を!!(obj instanceof Array)返し、true(正しい)を返します
zamnuts 2013年

10
その理由は、!objが最初にif(!obj instanceof Array)で評価され、それがtrue(またはfalse)に評価され、次にif(bool instanceof Array)になり、明らかにfalseになるためです。したがって、推奨されるように括弧で囲んでください。
ronnbot 2013年

1
この理由は本当に答えの一部であるはずです、さもなければ、この答えは以下のクリスの答えよりも優れていません。@SergioTulentsev、あなたはとても親切で、このようなものを追加In this case, the order of precedence is important (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence). The ! operator precedes the instanceof operator. しますか?あなたの答えに?
user0800

73
if (!(obj instanceof Array)) {
    // do something
}

他の人がすでに答えているように、これを確認する正しい方法です。提案されている他の2つの戦術は機能せず、理解する必要があります...

!括弧なしの演算子の場合。

if (!obj instanceof Array) {
    // do something
}

この場合、優先順位が重要です(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence)。!オペレータは、先行するinstanceof演算子を。したがって、最初に!obj評価されますfalse(これはと同等! Boolean(obj)です)。次に、がfalse instanceof Array否定的であるかどうかをテストします。

!演算子の前のinstanceof演算子の場合。

if (obj !instanceof Array) {
    // do something
}

これは構文エラーです。などの!=演算子は、EQUALSに適用されるNOTとは対照的に、単一の演算子です。演算子がない!instanceofのと同じように、そのような演算子はありません!<


NB。それは明らかに正しいので、私はこれをセルジオの答えについてコメントしたでしょうが、私はSOのメンバーではなかったので、コメントするのに十分な評判ポイントがありませんでした。
chrismichaelscott 2013年

5
問題(この問題のような)の理由を説明する回答のみが受け入れられるべきです...
Robert Rossmann、2015

@chrismichaelscott私の意見では、私は私だけではないと確信しています。あなたのような答えは、ここで質問する人が最も望んでいるものです。ポイントまでは明らかであり、提示された問題を回避するのに十分な情報と例を共有しています。どうもありがとう。そして、私はあなたが評判に値するものであり、受け入れられた答えであるべきだったと思います。
cram2208

42

括弧(大括弧)は忘れがちなので、次のようにする習慣をつけることができます。

if(obj instanceof Array === false) {
    //The object is not an instance of Array
}

または

if(false === obj instanceof Array) {
    //The object is not an instance of Array
}

ここで試してください


7
それは実際には私にとって否定よりもきれいに見えます。
Kamil Latosinski 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.