Isu yang perlu anda perhatikan apabila menggunakan for loops dalam javascript - dengan ringkasan kemahiran problems_javascript

WBOY
Lepaskan: 2016-05-16 15:44:31
asal
958 orang telah melayarinya

Menggunakan gelung adalah mudah jika anda ingin menjalankan kod yang sama berulang kali, dengan nilai yang berbeza setiap kali.

Banyak kali kita menggunakan untuk gelung, dan jabatan gelung sering kali menggelungkan pada tatasusunan Banyak kali kita menulisnya seperti ini:

// 次佳的循环
for (var i = 0; i < myarray.length; i++) {
  // 使用myarray[i]做点什么
}
Salin selepas log masuk

Walaupun tidak ada masalah besar dengan kod sedemikian, ia akan mendapat panjang tatasusunan setiap kali ia gelung, yang akan mengurangkan kod anda, terutamanya apabila myarray bukan tatasusunan, tetapi HTMLCollectionApabila objek.

Lihat kod di bawah:

for (var i = 0, max = myarray.length; i < max; i++) {
  // 使用myarray[i]做点什么
}
Salin selepas log masuk

Kod ini hanya akan memperoleh panjang tatasusunan sekali, yang meningkatkan kualiti kod

Dengan bentuk var tunggal, anda boleh menarik pembolehubah keluar daripada gelung, seperti ini:

function looper() {
  var i = 0,
    max,
    myarray = [];
  // ...
  for (i = 0, max = myarray.length; i < max; i++) {
   // 使用myarray[i]做点什么
  }
}
Salin selepas log masuk

Ringkasan masalah apabila JavaScript menggunakan gelung

Perbincangan isu ini pada asalnya datang dari e-mel dalaman syarikat saya baru sahaja merakamkan perbincangan isu ini.

Apabila mencari masalah, beberapa pasukan projek mendapati bahawa apabila menggunakan “untuk(x dalam tatasusunan)”, nilai x yang tidak dijangka muncul dalam pelayar IE.

Secara khususnya, jika kaedah Array.prototype.indexOf disesuaikan (contohnya, disebabkan pencemaran prototaip tertentu), ia mungkin kerana versi lama pelayar IE tidak menyokong array.indexOf kaedah, dan pembangun saya benar-benar mahu menggunakannya, tetapi penyemak imbas sedemikian boleh menyebabkan masalah berikut:

Array.prototype.indexOf = function(){...};
var arr = [1, 2];
for (x in arr) console.log(x);
Salin selepas log masuk

//akan mengeluarkan

1
2
function(){…}
Salin selepas log masuk

Dengan kata lain, kaedah indexOf ialah output.

Penyelesaiannya mudah, sama ada jangan tambah kaedah ini atau gunakan gelung seperti "untuk (i=0; i < array.length; i )" dsb.

Tetapi apakah sifat masalahnya? Sesetengah orang membuat spekulasi bahawa ia mungkin kerana penggunaan for(x in obj) sebenarnya untuk melintasi objek, dan pelaksanaan tatasusunan sebenarnya sama seperti objek biasa, kecuali kunci hanyalah nilai yang diberikan:

{0:"something", 1:"something else"}
Salin selepas log masuk

Ia juga disebut dalam soalan dan jawapan stackoverflow bahawa terdapat perbezaan antara menggunakan for...in dan for(;;) apabila melintasi tatasusunan bermaksud untuk menghitung sifat objek masalah:

Tertib penghitungan tidak dijamin;

Harta yang diwarisi juga dikira


Dari segi sokongan untuk

Array.prototype.forEach, dapat dilihat dengan jelas daripada jadual ini bahawa IE8 dan ke bawah tidak boleh disokong dengan tepat:

Berikut juga penjelasan terperinci tentang keserasian kaedah forEach. Malah, rangka kerja JavaScript utama (seperti jQuery, Underscore, Prototaip, dll.) semuanya mempunyai pelaksanaan yang selamat dan umum untuk setiap fungsi.

Ia juga disebut dalam bab untuk dalam JSLint bahawa pernyataan untuk dalam membenarkan gelung melalui nama atribut objek, tetapi ia juga akan melintasi atribut yang diwarisi melalui rantai prototaip, yang dalam banyak kes akan menyebabkan ralat yang tidak dijangka . Terdapat penyelesaian kasar:

for (name in object)

 { if (object.hasOwnProperty(name))

 { .... } }
Salin selepas log masuk

Sesetengah orang juga menyebut masalah apabila menggunakan

for(var i=0;i serupa dengan gelung ini, kerana JavaScript tidak mempunyai pembolehubah tahap blok kod, jadi akses i di sini Kebenaran sebenarnya ialah kaedah di mana ia berada. Sesetengah buku akan menasihati pengaturcara untuk meletakkan pengisytiharan berubah-ubah sedemikian di satu tempat, tetapi secara intuitif, ia tidak cukup munasabah dalam kebanyakan kes.

Menggunakan "let" yang diperkenalkan dalam JavaScript 1.7 menyelesaikan masalah ini, menjadikan i pembolehubah peringkat blok sebenar:

for(let i =0; i < a.length; i++)
Salin selepas log masuk
Akhir sekali, panduan gaya JavaScript Google turut melibatkan kekangan ini:

for-in loop:


Only for iterating over keys in an object/map/hash
Salin selepas log masuk
Di atas adalah keseluruhan kandungan artikel ini tentang isu yang perlu diberi perhatian apabila menggunakan for loop dalam JavaScript - dengan ringkasan isu ini saya harap ia akan membantu untuk kerja dan kajian masa hadapan dan cadangan daripada orang dalam industri.

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan