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.

Harun
sumber
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)) { ... }
Jordão
sumber
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)) { ... }
beberapa
sumber
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.

Makanan ternak
sumber
14

Dua kemungkinan cepat:

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

atau

if(myObj['foo'] === undefined) { ... }
reedlauber
sumber
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