Javascript! Instanceof If заявление

186

Это действительно простой вопрос, чтобы удовлетворить мое любопытство, но есть ли способ сделать что-то вроде этого:

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

Ключ здесь в состоянии использовать НЕ! перед экземпляром. Обычно способ настроить это так:

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

И немного раздражает необходимость создания оператора else, когда я просто хочу узнать, относится ли объект к определенному типу.

ryandlf
источник

Ответы:

356

Заключите в скобки и отрицайте снаружи.

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

В этом случае важен порядок приоритета ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). ! Оператор предшествует оператору instanceof.

Серхио Туленцев
источник
9
@ hrishikeshp19 - Я уверен, что вам нужны парены, я только что попробовал это в chrome, IE и узле, и каждый хост нуждался в них.
Маркус Папа
1
@ riship89 необходимы символы Parens, доказательство: !! obj instanceof Arrayвозвращает false (неверно), а !!(obj instanceof Array)возвращает true (правильно)
zamnuts
10
Причина в том, что! Obj вычисляется сначала в if (! Obj instanceof Array), который оценивается как true (или false), а затем становится if (bool instanceof Array), что, очевидно, ложно. Поэтому, оберните это в круглые скобки как предложено.
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
}

Это синтаксическая ошибка. Операторы, такие как !=являются одним оператором, в отличие от НЕ применяется к EQUALS. Нет такого оператора, !instanceofкак не существует !<оператора.

chrismichaelscott
источник
NB. Я бы сделал это комментарием к ответу Серхио, поскольку это, очевидно, правильно, но я не был членом SO, поэтому у меня не было достаточно очков репутации, чтобы комментировать.
chrismichaelscott
5
Только ответы, которые объясняют причину проблемы (как эта), должны быть приняты ...
Роберт Россманн
@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
Для меня это выглядит чище, чем отрицание.
Камил Латосинский