Java脚本!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语句有点烦人。

Answers:


355

用括号括起来,在外面取反。

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

在这种情况下,优先顺序很重要(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence)。!运算符先于instanceof运算符。


9
@ hrishikeshp19-我很确定您需要parens,我只是在chrome,IE和node中尝试过,每个主机都需要它们。
马库斯·波普

1
@ riship89 parens是必需的,证明:!! obj instanceof Array返回false(不正确),而!!(obj instanceof Array)返回true(正确)
zamnuts

10
原因是!obj首先在if(!obj instanceof Array)中求值,其结果为true(或false),然后变为if(bool instanceof Array),这显然为false。因此,按照建议将其包装在括号中。
ronnbot

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
}

是检查此内容的正确方法-正如其他人已经回答的那样。已经提出的其他两种策略将不起作用,应该理解...

对于!没有括号的操作员。

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
}

这是语法错误。诸如的!=运算符是单个运算符,而不是应用于等式的NOT。没有这样的运算符,就像!instanceof没有!<运算符一样。


注意 我本来会对Sergio的回答发表评论,因为这显然是正确的,但我不是SO的成员,所以没有足够的声誉点可以发表评论。
chrismichaelscott

5
只有能解释问题原因的答案(像这个问题)才应该被接受...
罗伯特·罗斯曼

@chrismichaelscott以我的观点,而且我确定我并不孤单,像您这样的回答是任何在这里提出问题的人最想要的。显然,这一点很明显,并且可以共享足够的信息和示例来解决所提出的问题。非常感谢。而且我认为您应得到声誉,应该得到公认的答案。
cram2208 '16

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
对我来说,实际上看起来比否定要干净。
卡米尔·拉托辛斯基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.