Nesne özelliklerini kontrol etmek için JavaScript'te "içinde değil" operatörü var mı?


183

Bir nesnede bir özelliğin bulunup bulunmadığını kontrol etmek için JavaScript'te herhangi bir "içinde değil" operatörü var mı? Google veya Stack Overflow ile ilgili hiçbir şey bulamadım. İşte ben bu tür işlevselliğe ihtiyaç duyduğum yerde çalıştığım küçük bir kod snippet'i:

var tutorTimes = {};

$(checked).each(function(idx){
  id = $(this).attr('class');

  if(id in tutorTimes){}
  else{
    //Rest of my logic will go here
  }
});

Gördüğünüz gibi, her şeyi elseifadeye koyuyorum . Sadece kısmı kullanmak için bir if- elsedeyimi ayarlamak benim için yanlış görünüyor else.


4
Bence var id = ...senin fonksiyonunda isteyebilirsin .
Cobby

Yanıtlar:


338

Sadece else kısmını kullanmak için bir if / else deyimi ayarlamak benim için yanlış görünüyor ...

Sadece durumunuzu ortadan kaldırın ve elsemantığı aşağıdakilerin içine alacaksınız if:

if (!(id in tutorTimes)) { ... }

11
Bu stil ayrıca eğer Bilseydin alırdım uyarı " '!' Kullanımını karmakarışık" JSHint düzeltir( ! somekey in someobj )
mikemaccana

3
Unutmayın ki içinde özellik adı için yapılan aramaların her yerde prototip zincirinde. Benim Bkz cevabı daha fazla ayrıntı için.
Bazıları

25
Bunun şu anda en iyi çözüm olduğunu anlıyorum, ancak herkes bunun çirkin olduğunu kabul ediyor mu?
Jonah

3
Eğer çirkin, o zaman sadece bir fonksiyona sarın ve güzel bir isim verin 🙃let keyExists = (key, obj) => key in obj
Kamafeather

Tamamen katılıyorum. Gerçekten de isimlendirme becerilerim de geliştirilebilir 😁. let hasProperty"daha iyi" görünüyor
Kamafeather

37

Jordão tarafından zaten söylendiği gibi, sadece reddet:

if (!(id in tutorTimes)) { ... }

Not: Yukarıdaki test, tutorTimes öğesinin prototip zincirinin herhangi bir yerinde id'de belirtilen bir özelliğe sahip olup olmadığını test eder . Örneğin , Object.prototype içinde tanımlandığından true değerini "valueOf" in tutorTimesdöndürür .

Geçerli nesnede bir özelliğin bulunup bulunmadığını test etmek istiyorsanız, hasOwnProperty kullanın:

if (!tutorTimes.hasOwnProperty(id)) { ... }

Veya hasOwnPropery olan bir anahtarınız varsa bunu kullanabilirsiniz:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }

Herhangi mi daha güvenli tırnak ve kullanımda anahtarı sarmak için if(!tutorTimes.hasOwnProperty('id')) ...?
Majid Fouladpour

@MajidFouladpour idherhangi bir değere sahip olabilecek bir değişkendir, 'id'iki harfle bir dizedir i ve d yüzden, hasOwnProperty(id)çekler değişken belirtilen mülkiyet eğer id var ve hasOwnProperty('id')kontroller adında bir özellik kimliği varsa.
Bazı

17

Şahsen buluyorum

if (id in tutorTimes === false) { ... }

okumak daha kolay

if (!(id in tutorTimes)) { ... }

ama ikisi de işe yarayacak.


14

İki hızlı olasılık:

if(!('foo' in myObj)) { ... }

veya

if(myObj['foo'] === undefined) { ... }

5
'undefined' === typeof xxxBunun yerine kullanın . undefinedAyrılmış bir kelime değildir ve aslında üzerine yazılabilen (hataları bulmak
zorlaşır

9
@hippietrail çalışmıyor ... "!" ve çevresinde'foo' in myObj)
Phil Cooper

4
myObj['foo']bir özellik olarak var olabilir ve yalnızca undefined(yani ifadeyle myObj.foo = undefined) olarak ayarlanabilir . Mülkün kendisinin var olup olmadığını gerçekten görmek istiyorsanız, !('foo' in myObj)gösterime ihtiyacınız var .
Richard Connamacher

Aramızdaki bilinçli performans için, kontrol etmek myObj.foo === undefinedçok daha hızlıdır (potansiyel olarak tehlikeli de olsa): jsperf.com/not-in-vs-is-undefined .
etpinard

@hugomg Bunun kullanmamak için çok iyi bir argüman olduğunu düşünmüyorum === undefined. İnsanlar bir programlama dilini, örneğin undefinedJavaScript'te üzerine yazma gibi şeyler yaparak kötüye kullanırsa, birçok şey kırılabilir . Ayrıca bkz. Stackoverflow.com/questions/8783510/…
Zero3
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.