Artikel pertama ini akan berbicara tentang beberapa detail pemrograman nodej.
1. Iterasi melalui array
untuk (var i = 0, l = arr.length; i <l; i ++)
Salah satu keuntungan menulis dengan cara ini adalah untuk mendapatkan operasi mendapatkan panjang objek array dengan satu langkah lebih sedikit di setiap loop. Semakin lama panjang array, semakin jelas nilainya.
2. Tentukan keaslian variabel
if (a) {...} // a = '', a = '0', a = [], a = {}Hasil jika penilaian bersyarat adalah: Salah, Benar, Benar, Benar. Hasil ini berbeda dari hasil PHP, jadi jangan bingung. Penting juga untuk membedakan antara situasi di mana ia mirip dengan penilaian non-identitas.
3. Penilaian non-identitas dari nilai 0
1 if (0 == '0') {...} // true2 if (0 == []) {...} // true3 if (0 == [0]) {...} // true4 if (0 == {}) {...} // false5 if (0 == null) {{} // false6 if (0 == if (0 == null) {{{{{0 =Bahkan, ada banyak penilaian aneh seperti itu, dan saya hanya mendaftarkan yang lebih umum. Jika Anda ingin memahami aturannya, silakan merujuk ke posting blog lain dari saya: [JavaScript] Analisis mendalam tentang operasi relasional JavaScript dan jika pernyataan.
4. Perangkap Purs
var n = parseInt (s); // s = '010'
Setelah pernyataan dieksekusi, nilai n adalah 8, bukan 10. Meskipun banyak orang tahu ini, tidak dapat dihindari bahwa akan ada kesalahan dalam pemrograman, dan saya memiliki pemahaman yang mendalam tentang hal itu. Oleh karena itu, yang terbaik adalah menulis dengan cara berikut, jadi tidak akan ada kesalahan.
var n = parseInt (S, 10);
5. Harus mendeklarasikan variabel sebelum digunakan
Meskipun tidak akan membuat kesalahan apa pun secara langsung menggunakan variabel tanpa menyatakannya, mudah untuk membuat kesalahan saat menulis dengan cara ini. Karena interpreter menafsirkannya sebagai variabel global, mudah untuk menyebabkan kesalahan dengan membaginya dengan variabel global lainnya. Karena itu, Anda harus mengembangkan kebiasaan yang baik untuk mendeklarasikan variabel sebelum menggunakannya.
6. Ada async di loop
untuk (var i = 0, l = arr.length; i <l; i ++) {var sql = "pilih * dari nx_user"; db.query (sql, function () {sys.log (i + ':' + sql);}); //db.query adalah operasi kueri tabel, yang merupakan operasi asinkron}Anda akan menemukan bahwa hasil outputnya sama, dan merupakan konten output ketika i = arr.length-1. Karena JavaScript adalah satu utusan, itu akan menjalankan konten sinkron dari loop lengkap sebelum melakukan operasi asinkron. Fungsi callback anonim dalam kode adalah panggilan balik asinkron. Ketika fungsi dieksekusi, loop untuk dan beberapa operasi sinkronisasi berikutnya telah dieksekusi. Karena prinsip penutupan, fungsi ini akan mempertahankan konten variabel SQL dan variabel i dari loop terakhir dari loop untuk, yang akan menyebabkan hasil yang salah.
Jadi apa yang harus saya lakukan? Ada dua solusi, satu adalah menggunakan fungsi langsung, sebagai berikut:
untuk (var i = 0, l = arr.length; i <l; i ++) {var sql = "pilih * dari nx_user"; (function (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //db.Query adalah operasi kueri tabel, yang merupakan operasi asinkron}) (sql, i);}Metode lain adalah mengekstrak bagian operasi asinkron dan menulis satu fungsi, sebagai berikut:
var outputsql = function (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //db.query adalah operasi kueri tabel, yang merupakan operasi asinkron} untuk (var i = 0, l = arr.length; i <l; i ++) {var sql = "pilih * dari nx_user"; outputsql (sql, i); }7. Saat memproses sejumlah besar data, cobalah untuk menghindari sarang loop.
Karena waktu pemrosesan sarang loop akan meningkat secara eksponensial dengan peningkatan jumlah data, itu harus dihindari sebanyak mungkin. Dalam hal ini, jika tidak ada cara yang lebih baik, strategi umum adalah bertukar ruang waktu, yaitu, untuk membuat tabel pemetaan hash data siklik sekunder. Tentu saja, analisis situasi tertentu juga diperlukan. Hal lain yang perlu dikatakan adalah bahwa beberapa metode adalah badan loop itu sendiri, seperti array.sort () (metode ini harus diimplementasikan dengan dua lapisan loop), jadi Anda perlu memperhatikan saat menggunakannya.
8. Cobalah untuk menghindari panggilan rekursif.
Keuntungan dari panggilan rekursif adalah bahwa kodenya ringkas dan implementasinya sederhana, sedangkan kerugiannya sangat penting. Deskripsi berikut adalah sebagai berikut:
(1) Ukuran tumpukan fungsi akan tumbuh secara linier dengan level rekursif, dan tumpukan fungsi memiliki nilai batas atas. Ketika rekursif mencapai sejumlah lapisan, tumpukan fungsi akan meluap, menghasilkan kesalahan program;
(2) Setiap lapisan rekursif akan menambahkan tumpukan tambahan penekan dan operasi rilis tumpukan, yaitu, situs penghematan dan situs pemulihan selama panggilan fungsi.
Oleh karena itu, panggilan rekursif harus dihindari sebanyak mungkin.
9. Mengenai isolasi lingkup file modul.
Ketika Node mengkompilasi file modul JavaScript, kontennya telah dibungkus di awal dan akhir, sebagai berikut:
(fungsi (ekspor, membutuhkan, modul, __filename, __dirname) {kode file javascript Anda});Ini memungkinkan isolasi lingkup antara setiap file modul. Oleh karena itu, ketika Anda menulis file modul nodeJS, Anda tidak perlu menambahkan lapisan lain enkapsulasi isolasi lingkup. Misalnya, format kode berikut hanya akan menambahkan lapisan panggilan fungsi tambahan, yang tidak disarankan:
(fungsi(){ ... …})();10. Jangan mencampur array dan objek
Berikut adalah contoh kode kesalahan:
var o = []; o ['name'] = 'liming';
Array dan objek campuran dapat menyebabkan kesalahan yang tidak terduga. Seorang kolega saya mengalami masalah yang sangat aneh. Mari kita lihat kode terlebih dahulu:
var o = []; o ['name'] = 'liming'; var s = json.stringify (o);
Dia berpikir bahwa atribut nama objek O akan ada di string JSON, tetapi hasilnya bukan apa -apa. Saya juga sangat aneh pada saat itu, tetapi saya memiliki firasat bahwa itu adalah masalah pencampuran array dan benda. Saya mencobanya dan memang masalahnya. Kemudian saya menemukan dalam spesifikasi ECMA bahwa array diserialisasi sesuai dengan aturan JA. Karena itu, Anda harus mengembangkan kebiasaan pemrograman yang baik, menggunakan array dan objek dengan benar, dan jangan mencampurnya.
11. Janji Pemrograman Elegan
Saya percaya bahwa orang -orang yang telah terpapar nodej memiliki pengalaman ini. Ketika panggilan balik asinkron bersarang dalam panggilan balik asinkron, kode tersebut tampaknya sangat membingungkan dan tidak memiliki kemudahan keterbacaan. Dilema nodej ini dapat diatasi dengan janji. Janji itu seperti alat pahatan yang membuat kode Anda elegan dan indah. Ada spesifikasi A+ untuk janji, dan ada beberapa metode implementasi online, Anda dapat merujuknya.