Javascript! İnstanceof If Deyimi


186

Bu sadece merakımı tatmin etmek için gerçekten temel bir soru, ancak böyle bir şey yapmanın bir yolu var:

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

Burada anahtar NOT kullanmak mümkün! örneğin önünde. Genellikle ben bunu kurmak zorunda yolu şöyledir:

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

Ve sadece nesnenin belirli bir tür olup olmadığını bilmek istediğinizde başka bir ifade oluşturmak zorunda biraz can sıkıcı.

Yanıtlar:


356

Parantez içine alın ve dışarıdan olumsuzlanın.

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

Bu durumda, öncelik sırası önemlidir ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). ! işleci işleci örneğinden önce gelir.


9
@ hrishikeshp19 - Ben parens gerekir eminim, ben sadece krom, IE ve düğüm denedim ve her ev sahibi onlara ihtiyacı vardı.
Marcus Pope

1
@ riship89 parens gerekli, kanıt: !! obj instanceof Arrayyanlış döndürür (yanlış) !!(obj instanceof Array)doğru döndürür (doğru)
zamnuts

10
Bunun nedeni,! Obj'in önce doğru (veya false) olarak değerlendirilen if (! Obj instanceof Artan) 'da değerlendirilmesidir; Bu nedenle, önerildiği gibi parantez içine sarın.
ronnbot

1
Bu sebep gerçekten cevabın bir parçası olmalıdır, aksi takdirde bu cevap aşağıdaki Chris'in cevabından daha iyi değildir. @SergioTulentsev, bu kadar nazik olur ve buna benzer bir şey ekler misiniz: 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. cevabınıza?
user0800

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

Bunu kontrol etmenin doğru yolu - diğerleri zaten cevapladığı gibi. Önerilen diğer iki taktik işe yaramayacak ve anlaşılmalıdır ...

!Braketsiz operatör durumunda .

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

Bu durumda, öncelik sırası önemlidir ( https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence ). !Operatör önce gelir instanceofoperatörü. Yani, ilk olarak !objdeğerlendirilir false(eşittir ! Boolean(obj)); o zaman false instanceof Arrayaçıkça negatif olup olmadığını test ediyorsunuz .

!Operatörden önce operatör olması durumunda instanceof.

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

Bu bir sözdizimi hatasıdır. Örneğin operatörler olarak !=bir bir eşit olduğu bir UYGULANMAZ aksine, tek bir operatör vardır. Operatör olmadığı gibi bir operatör !instanceofyoktur !<.


NB. Açıkçası doğru olduğu gibi bu Sergio'nun cevabı hakkında bir yorum yapardı ama SO üyesi değildi yani yorum için yeterli itibar puan yoktu.
chrismichaelscott

5
Sadece bir sorunun nedenini açıklayan cevaplar (bunun gibi) kabul edilmelidir ...
Robert Rossmann

@chrismichaelscott Benim görüşüme göre ve eminim ki yalnız değilim, sizinki gibi bir cevap, burada bir soru soran herkesin en çok istediği şey. Bu noktaya kadar açıktır ve sunulan sorunun etrafından dolaşmak için yeterli bilgi ve örneği paylaşmaktadır. Çok teşekkürler. Bence itibarı hak ediyorsun ve kabul edilen cevap olmalıydı.
cram2208

42

Parantezi (parantez) unutmak kolaydır, böylece yapmayı alışkanlık haline getirebilirsiniz:

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

veya

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

Burada deneyin


7
Aslında benim için olumsuzlamadan daha temiz görünüyor.
Kamil Latosinski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.