Apakah ada operator "tidak ada" dalam JavaScript untuk memeriksa properti objek?


182

Apakah ada operator "tidak ada" dalam JavaScript untuk memeriksa apakah suatu properti tidak ada dalam suatu objek? Saya tidak dapat menemukan apa pun tentang ini di Google atau Stack Overflow. Berikut ini adalah potongan kecil kode yang saya kerjakan di mana saya memerlukan fungsionalitas semacam ini:

var tutorTimes = {};

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

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

Seperti yang Anda lihat, saya akan memasukkan semuanya ke dalam elsepernyataan. Tampaknya salah bagi saya untuk membuat if- elsepernyataan hanya dengan menggunakan elsebagian itu.


4
Saya pikir Anda mungkin ingin var id = ...fungsi Anda.
Cobby

Jawaban:


338

Tampaknya salah bagi saya untuk mengatur pernyataan if / else hanya menggunakan bagian lain ...

Cukup negasikan kondisi Anda, dan Anda akan mendapatkan elselogika di dalam if:

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

11
Gaya ini juga memperbaiki JSHint peringatan "Membingungkan penggunaan '!'" Yang akan Anda dapatkan jika Anda melakukannya jika( ! somekey in someobj )
mikemaccana

3
Harap perhatikan bahwa dalam pencarian untuk nama properti di mana saja dalam rantai prototipe. Lihat jawaban saya untuk lebih jelasnya.
beberapa

25
Saya mengerti ini adalah solusi terbaik, tetapi apakah orang lain setuju bahwa ini agak jelek?
Jonah

3
Jika jelek maka bungkus saja dalam suatu fungsi dan beri nama yang indah 🙃let keyExists = (key, obj) => key in obj
Kamafeather

Saya sangat setuju. Memang keterampilan penamaan saya juga bisa ditingkatkan 😁. let hasProperty"looks" better
Kamafeather

37

Seperti yang sudah dikatakan oleh Jordão, sangkal saja:

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

Catatan: Tes di atas jika tutorTimes memiliki properti dengan nama yang ditentukan dalam id, di mana saja dalam rantai prototipe. Sebagai contoh "valueOf" in tutorTimesmengembalikan true karena didefinisikan dalam Object.prototype .

Jika Anda ingin menguji apakah properti tidak ada di objek saat ini, gunakan hasOwnProperty:

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

Atau jika Anda mungkin memiliki kunci yang hasOwnPropery Anda dapat menggunakan ini:

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

Apakah lebih aman untuk membungkus kunci dalam tanda kutip dan digunakan if(!tutorTimes.hasOwnProperty('id')) ...?
Majid Fouladpour

@MajidFouladpour idadalah variabel yang dapat memiliki nilai apa pun, 'id'adalah string dengan dua huruf i dan d , jadi hasOwnProperty(id)periksa apakah properti yang ditentukan dalam id variabel ada, dan hasOwnProperty('id')periksa apakah ada properti bernama id.
sekitar

16

Secara pribadi saya temukan

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

lebih mudah dibaca daripada

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

tetapi keduanya akan bekerja.


14

Dua kemungkinan cepat:

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

atau

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

5
Gunakan 'undefined' === typeof xxxsebagai gantinya. undefinedbukan kata yang dilindungi undang-undang dan sebenarnya merupakan variabel global yang dapat ditimpa (menyebabkan sulitnya menemukan bug)
hugomg

9
@hippietrail tidak berfungsi ... parens diminta setelah "!" dan di sekitar'foo' in myObj)
Phil Cooper

4
myObj['foo']bisa ada sebagai properti dan hanya diatur ke undefined(yaitu, dengan pernyataan myObj.foo = undefined). Jika Anda benar-benar ingin melihat apakah properti itu sendiri tidak ada, Anda perlu !('foo' in myObj)notasi.
Richard Connamacher

Untuk kesadaran kinerja di antara kami, memeriksa myObj.foo === undefinedjauh lebih cepat (meskipun berpotensi berbahaya): jsperf.com/not-in-vs-is-undefined .
etpinard

@hugomg Saya tidak berpikir itu argumen yang sangat bagus untuk tidak menggunakan === undefined. Banyak hal yang dapat rusak jika orang menyalahgunakan bahasa pemrograman dengan melakukan hal-hal seperti, misalnya, menimpa undefinedJavaScript. Juga, lihat: stackoverflow.com/questions/8783510/…
Zero3
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.