Saya diarahkan ke halaman MDN for..in ketika ia mengatakan, "for..in Iterates atas properti enumerable dari suatu objek."
Lalu aku pergi ke Enumerability dan kepemilikan properti di mana ia mengatakan "Properti enumerable adalah mereka yang dapat diulang dengan for for..in loop."
Kamus ini mendefinisikan enumerable sebagai dapat dihitung, tetapi saya tidak dapat benar-benar memvisualisasikan apa artinya. Bisakah saya mendapatkan contoh sesuatu yang dapat dihitung?
javascript
enumerable
Patrick
sumber
sumber
for-in
?for in
lingkaran atau tidak (bagi mereka yang tidak ingin mengetahui detailnya atau tidak peduli;))Jawaban:
Properti enumerable adalah properti yang dapat dimasukkan dan dikunjungi selama
for..in
loop (atau iterasi properti yang serupa, misalnyaObject.keys()
).Jika properti tidak diidentifikasi sebagai enumerable, loop akan mengabaikan bahwa itu ada di dalam objek.
Properti diidentifikasi sebagai enumerable atau bukan oleh
[[Enumerable]]
atributnya sendiri . Anda dapat melihat ini sebagai bagian dari deskriptor properti :Sebuah
for..in
loop kemudian beralih melalui nama properti objek.Tetapi, hanya mengevaluasi pernyataannya -
console.log(prop);
dalam hal ini - untuk properti yang[[Enumerable]]
atributnya adalahtrue
.Kondisi ini terjadi karena objek memiliki lebih banyak properti , terutama dari warisan :
Masing-masing dari properti ini masih ada di objek :
Tapi, mereka dilewati oleh
for..in
loop karena mereka tidak terhitung.sumber
But, they are skipped (or not counted) by the for..in loop because they are not enumerable
. Properti padaObject.prototype
kenyataannya diabaikan karena mereka lebih lanjut rantai prototipe, bukan karena mereka tidak dapat dihitung. BaikgetOwnPropertyNames()
ataukeys()
menunjukkan properti yang bukan milik objek. Sebagai catatan tambahan, memang benar bahwa banyak properti bawaan tidak dapat dihitung dan dengan demikian tidak akan ditampilkankeys()
, tetapi Anda harus menulis kode tambahan jika Anda ingin melintasi rantai prototipe.Jika Anda membuat objek melalui
myObj = {foo: 'bar'}
atau sesuatu tentang itu, semua properti dapat dihitung. Jadi pertanyaan yang lebih mudah diajukan adalah, apa yang tidak bisa dihitung? Objek tertentu memiliki beberapa properti non-enumerable, misalnya jika Anda memanggilObject.getOwnPropertyNames([])
(yang mengembalikan array semua properti, enumerable atau tidak, pada []), ia akan kembali['length']
, yang mencakup properti non-enumerable dari array, 'length' .Anda dapat membuat properti non-enumerable Anda sendiri dengan menelepon
Object.defineProperty
:Contoh ini meminjam banyak dari properti yang tidak dapat dihitung dalam JavaScript , tetapi menunjukkan objek yang disebutkan. Properti bisa atau tidak bisa ditulis, dapat dikonfigurasi, atau dapat dihitung. John Resig membahas ini dalam ruang lingkup ECMAScript 5 Objects and Properties .
Dan, ada pertanyaan Stack Overflow tentang mengapa Anda ingin membuat properti tidak dapat dihitung .
sumber
Ini jauh lebih membosankan daripada sesuatu yang harus divisualisasikan.
Secara harfiah ada atribut pada semua properti yang disebut "enumerable." Ketika disetel ke false,
for..in
metode akan melewati properti itu, berpura-pura itu tidak ada.Ada banyak properti pada objek yang memiliki "enumerable" disetel ke false, seperti "valueOf" dan "hasOwnProperty," karena dianggap Anda tidak ingin mesin JavaScript mengulanginya.
Anda dapat membuat properti non-enumerable Anda sendiri menggunakan
Object.defineProperty
metode:Sekarang, fakta bahwa bahkan ada rahasia tentang mobil itu tersembunyi. Tentu saja mereka masih dapat mengakses properti secara langsung dan mendapatkan jawabannya:
Tetapi, mereka harus tahu bahwa properti itu ada terlebih dahulu, karena jika mereka mencoba mengaksesnya
for..in
atauObject.keys
itu akan tetap sepenuhnya rahasia:Mereka seharusnya menyebutnya, "untuk InAble."
sumber
Jika Anda mengalami kesulitan memvisualisasikan "apa artinya menjadi enumerable?" mengapa tidak bertanya pada diri sendiri, apa artinya menjadi tak terhitung ?
Saya memikirkannya sedikit seperti ini, properti yang tidak dapat dihitung ada tetapi sebagian tersembunyi ; artinya tidak dapat dihitung adalah yang aneh. Sekarang Anda dapat membayangkan enumerable sebagai apa yang tersisa - properti yang lebih alami yang kami temui sejak kami menemukan Objects . Mempertimbangkan
Sekarang
for..in
, bayangkan itu seperti kodesemudi mana tubuh loop yang Anda ketikkan dalam JavaScript berada di tempat
/* whatever */
sumber
Saya akan menulis satu definisi garis ENUMERABLE
Enumerable
: Menentukan apakah properti dapat dikembalikan dalam for / in loop.sumber
metode tidak dapat dihitung; atau lebih tepatnya metode yang dibangun bukan .. tho setelah mencari apa artinya enumerable untuk skrip java; itu hanya merujuk ke atribut properti .. semua objek yang dibuat di ecma3 dapat dihitung, dan sekarang ecma5 Anda dapat mendefinisikannya .... itu saja ..: D lol butuh sedikit untuk menemukan jawabannya; tapi saya percaya itu dibicarakan dalam buku David Flanagan .. jadi saya kira itu berarti "tersembunyi", atau tidak "tersembunyi" dalam metode yang tidak ditampilkan dalam for in loop, dan dengan demikian "tersembunyi"
sumber
Pikirkan tipe data enum, hanya struktur objek yang sesuai dengan angka yang berbeda. Untuk mendeklarasikan sesuatu sebagai enumerable berarti menyatakan bahwa itu sesuai dengan angka tertentu, yang memungkinkannya diberikan tempat dalam Kamus yang mewakili komponen yang dapat dihitung dari suatu objek. Sederhananya, membuat objek yang dapat dihitung sama dengan mengatakan pada kompiler, "Hei, properti ini penting, saya ingin melihat ini ketika saya memeriksa data pada objek ini."
sumber
Metode bawaan yang diwarisi objek tidak dapat dihitung, tetapi properti yang ditambahkan kode Anda ke objek dapat dihitung kecuali dinyatakan secara eksplisit
sumber