Javascript! Instanceof Jika Pernyataan

186

Ini adalah pertanyaan yang sangat mendasar benar-benar hanya untuk memuaskan keingintahuan saya, tetapi apakah ada cara untuk melakukan sesuatu seperti ini:

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

Kuncinya di sini adalah bisa menggunakan TIDAK! di depan misalnya. Biasanya cara saya mengatur ini adalah seperti ini:

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

Dan itu agak menjengkelkan harus membuat pernyataan lain ketika saya hanya ingin tahu apakah objek adalah tipe tertentu.

ryandlf
sumber

Jawaban:

356

Lampirkan dalam tanda kurung dan negasikan di luar.

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

Dalam kasus ini, urutan prioritas adalah penting ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). Itu! Operator mendahului instance dari operator.

Sergio Tulentsev
sumber
9
@ hrishikeshp19 - Saya cukup yakin Anda memerlukan parens, saya baru saja mencobanya di chrome, IE dan node dan setiap host membutuhkannya.
Marcus Pope
1
Dibutuhkan @ riship89 parens, bukti: !! obj instanceof Arraymengembalikan false (salah) sementara !!(obj instanceof Array)mengembalikan true (benar)
zamnuts
10
Alasannya adalah bahwa! Obj dievaluasi terlebih dahulu di if (! Obj instanceof Array), yang dievaluasi benar (atau salah), yang kemudian menjadi if (bool instanceof Array), yang jelas-jelas salah. Karena itu, bungkus dalam tanda kurung seperti yang disarankan.
ronnbot
1
Alasan ini harus benar-benar menjadi bagian dari jawaban, jika tidak jawaban ini tidak lebih baik daripada yang ada di bawah ini. @SergioTulentsev, apakah Anda akan baik dan menambahkan sesuatu seperti ini: 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. ke jawaban Anda?
user0800
73
if (!(obj instanceof Array)) {
    // do something
}

Apakah cara yang benar untuk memeriksa ini - karena orang lain sudah menjawab. Dua taktik lain yang telah disarankan tidak akan berhasil dan harus dipahami ...

Dalam kasus !operator tanpa tanda kurung.

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

Dalam kasus ini, urutan prioritas adalah penting ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). The !Operator mendahului instanceofoperator. Jadi, !objdievaluasi falsedulu (sama dengan ! Boolean(obj)); maka Anda menguji apakah false instanceof Array, yang jelas negatif.

Dalam kasus !operator sebelum instanceofoperator.

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

Ini adalah kesalahan sintaksis. Operator seperti !=adalah operator tunggal, sebagai lawan dari TIDAK diterapkan pada EQUALS. Tidak ada operator !instanceofdengan cara yang sama seperti tidak ada !<operator.

chrismichaelscott
sumber
NB. Saya akan membuat ini komentar pada jawaban Sergio karena itu jelas benar tetapi saya bukan anggota SO sehingga tidak memiliki poin reputasi yang cukup untuk berkomentar.
chrismichaelscott
5
Hanya jawaban yang menjelaskan mengapa masalah (seperti ini) harus diterima ...
Robert Rossmann
@ chrismichaelscott Menurut pendapat saya, dan saya yakin saya tidak sendirian, jawaban seperti milik Anda adalah yang paling dicari oleh siapa pun yang mengajukan pertanyaan di sini. Jelas, to the point, dan berbagi informasi dan contoh yang cukup untuk membahas masalah yang disajikan. Terima kasih banyak. Dan saya pikir Anda pantas mendapatkan reputasi dan seharusnya jawaban yang diterima.
cram2208
42

Sangat mudah untuk melupakan kurung (kurung) sehingga Anda dapat membiasakan diri melakukan:

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

atau

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

Coba di sini

Melayu
sumber
7
Ini sebenarnya terlihat lebih bersih daripada negasi bagi saya.
Kamil Latosinski