Apakah dua pernyataan berikut menghasilkan output yang sama? Apakah ada alasan untuk memilih satu cara ke yang lain?
if (key in object)
if (object.hasOwnProperty(key))
javascript
Lorraine Bernard
sumber
sumber
in will also return true if key gets found somewhere in the prototype chain
. dapatkah Anda menulis contoh? Terima kasih.({foo:"bar"}).hasOwnProperty("toString")
vs"toString" in ({foo:"bar"})
Saya akan mencoba menjelaskan dengan contoh lain. Katakanlah kita memiliki objek berikut dengan dua properti:
Mari kita buat instance dari TestObj:
Mari kita periksa contoh objek:
Kesimpulan:
di operator mengembalikan true selalu, jika properti dapat diakses oleh objek, langsung atau dari prototipe
hasOwnProperty () mengembalikan true hanya jika properti ada pada instance, tetapi tidak pada prototipe-nya
Jika kita ingin memeriksa bahwa ada beberapa properti pada prototipe, secara logis, kita akan mengatakan:
Akhirnya:
Jadi, terkait dengan pernyataan bahwa kedua syarat ini ...
... menghasilkan hasil yang sama, jawabannya jelas, itu tergantung.
sumber
in
juga akan memeriksa properti yang diwarisi, yang tidak berlaku untukhasOwnProperty
.sumber
Singkatnya,
hasOwnProperty()
tidak terlihat di prototipe sementarain
tidak terlihat di prototipe.Diambil dari O'Reilly High Performance Javascript :
sumber
Anda mendapat jawaban yang sangat bagus. Saya hanya ingin menawarkan sesuatu yang akan menghemat kebutuhan Anda untuk memeriksa "hasOwnProperty" saat iterasi objek.
Saat membuat objek biasanya orang akan membuatnya dengan cara ini:
Sekarang, jika Anda ingin mengulang melalui "someMap", Anda harus melakukannya dengan cara ini:
Kami melakukannya untuk menghindari iterasi dari properti yang diwarisi.
Jika Anda bermaksud membuat objek sederhana yang hanya akan digunakan sebagai "peta" (yaitu pasangan nilai kunci) Anda dapat melakukannya seperti itu:
Jadi sekarang akan aman untuk beralih seperti ini:
Saya belajar tip yang luar biasa ini di sini
sumber
(dari Crockford's Javascript: The Good Parts )
sumber
in
operator adalah berbeda darifor-in
pernyataan.in
adalah kata kunci. Tetapi OP bertanya tentang penggunaan spesifik sebagaiin
operator. Jawaban Anda berkaitan dengan penggunaan lain sebagai bagian darifor-in
pernyataan.Versi pertama lebih pendek (terutama dalam kode minified di mana variabel diubah namanya)
vs.
Bagaimanapun, seperti yang dikatakan @AndreMeinhold, mereka tidak selalu menghasilkan hasil yang sama.
sumber