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!
}

І це трохи прикро, щоб створити інший оператор, коли я просто хочу знати, чи є об'єкт конкретного типу.

Відповіді:


356

Вкладіть в круглі дужки і заперечте зовні.

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

У цьому випадку важливий порядок пріоритетності ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). The! Оператор передує екземпляру оператора.


9
@ hrishikeshp19 - Я впевнений, що вам потрібні парони, я просто спробував це в chrome, IE та node, і кожен хост потребував їх.
Маркус Папа

1
@ riship89 потрібні паролі, доказ: !! obj instanceof Arrayповертає помилкове (неправильне), а !!(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. до своєї відповіді?
користувач0800

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, застосованого до системи EQUALS. Не існує такого оператора, як !instanceofв тому самому, як немає !<.


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
Насправді це виглядає чистіше, ніж заперечення для мене.
Каміль Латосінський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.