Rumah  >  Artikel  >  hujung hadapan web  >  Ringkasan pembelajaran NodeJs saya (1)_node.js

Ringkasan pembelajaran NodeJs saya (1)_node.js

WBOY
WBOYasal
2016-05-16 16:42:311215semak imbas

Dalam artikel pertama ini, mari bercakap tentang beberapa butiran pengaturcaraan NodeJs.

1. Lintas tatasusunan

for (var i=0, l=arr.length; i<l; i++)

Satu kelebihan menulis dengan cara ini ialah setiap gelung menyimpan satu langkah untuk mendapatkan panjang objek tatasusunan Semakin panjang panjang tatasusunan, semakin jelas nilainya.

2. Tentukan sama ada pembolehubah itu benar atau salah

if (a) {...} //a='', a='0', a=[], a={}

Keputusan jika penghakiman bersyarat ialah: palsu, benar, benar, benar. Keputusan ini berbeza daripada keputusan PHP, jangan keliru. Ia juga perlu untuk membezakan antara situasi yang serupa dengan pertimbangan bukan identiti.

3. Penghakiman bukan identiti 0 nilai

1 if (0 == '0') {...} //true
2 if (0 == []) {...} //true
3 if (0 == [0]) {...} //true
4 if (0 == {}) {...} //false
5 if (0 == null) {...} //false
6 if (0 == undefined) {...} //false

Sebenarnya, terdapat banyak pertimbangan yang pelik, saya hanya menyenaraikan yang lebih biasa. Jika anda ingin memahami peraturan, sila rujuk catatan blog saya yang lain: [JavaScript] Analisis mendalam tentang operasi hubungan JavaScript dan pernyataan if.

4. Perangkap parseInt

var n = parseInt(s); //s='010'

Selepas pernyataan ini dilaksanakan, nilai n ialah 8, bukan 10. Walaupun ramai orang tahu perkara ini, kesilapan tidak dapat dielakkan dalam pengaturcaraan, dan saya tahu dengan baik. Oleh itu, yang terbaik adalah menulis dengan cara berikut dan anda tidak akan melakukan kesilapan.

var n = parseInt(s, 10);

5. Pembolehubah mesti diisytiharkan sebelum digunakan

Walaupun tiada ralat dalam menggunakan pembolehubah secara langsung tanpa mengisytiharkannya, penulisan dengan cara ini sangat terdedah kepada ralat. Oleh kerana jurubahasa akan mentafsirkannya sebagai pembolehubah global, ia boleh mempunyai nama yang sama dengan pembolehubah global lain dan menyebabkan ralat. Oleh itu, kita mesti membangunkan tabiat yang baik untuk mengisytiharkan pembolehubah sebelum menggunakannya.

6. Terdapat situasi tak segerak dalam gelung

for (var i=0, l=arr.length; i<l; i++) {
   var sql = "select * from nx_user";
  db.query(sql, function(){
    sys.log(i + ': ' + sql);
  }); //db.query为表查询操作,是异步操作
}

Anda akan mendapati bahawa hasil output adalah sama, dan ia adalah kandungan output apabila i=arr.length-1. Oleh kerana JavaScript adalah satu-benang, ia akan melaksanakan kandungan segerak keseluruhan gelung sebelum melaksanakan operasi tak segerak. Fungsi panggil balik tanpa nama dalam kod ialah panggilan balik tak segerak. Apabila fungsi ini dilaksanakan, gelung for dan beberapa operasi penyegerakan seterusnya telah selesai. Disebabkan oleh prinsip penutupan, fungsi ini akan mengekalkan kandungan pembolehubah sql dan pembolehubah i dalam gelung terakhir gelung for, jadi ia akan membawa kepada keputusan yang salah.

Jadi apa yang perlu kita lakukan? Terdapat dua penyelesaian Satu ialah menggunakan fungsi segera, seperti berikut:

for (var i=0, l=arr.length; i<l; i++) {
  var sql = "select * from nx_user";
  (function(sql, i){
    db.query(sql, function(){
      sys.log(i + ': ' + sql);
    }); //db.query为表查询操作,是异步操作
  })(sql, i);
}

Kaedah lain ialah mengekstrak bahagian operasi tak segerak dan menulis fungsi seperti berikut:

var outputSQL = function(sql, i){
   db.query(sql, function(){
      sys.log(i + ': ' + sql);
  }); //db.query为表查询操作,是异步操作
}

for (var i=0, l=arr.length; i<l; i++) {
  var sql = "select * from nx_user";
  outputSQL(sql, i); 
}


7 Apabila memproses sejumlah besar data, cuba elakkan gelung bersarang.

Oleh kerana masa pemprosesan gelung bersarang akan meningkat secara eksponen apabila jumlah data meningkat, ia harus dielakkan sebaik mungkin. Dalam kes ini, jika tiada cara yang lebih baik, strategi umum adalah untuk menukar ruang untuk masa, iaitu, untuk mewujudkan jadual pemetaan Hash bagi data kitaran sekunder. Sudah tentu, keadaan tertentu mesti dianalisis berdasarkan kes demi kes. Perkara lain yang perlu disebutkan ialah beberapa kaedah itu sendiri ialah badan gelung, seperti Array.sort() (kaedah ini harus dilaksanakan menggunakan dua lapisan gelung), jadi anda perlu memberi perhatian apabila menggunakannya.

8. Cuba elakkan panggilan rekursif.

Kelebihan panggilan rekursif ialah kodnya ringkas dan pelaksanaannya mudah, tetapi kelemahannya sangat penting dan dijelaskan seperti berikut:

(1) Saiz tindanan fungsi akan berkembang secara linear dengan tahap rekursi, dan tindanan fungsi mempunyai had atas Apabila rekursi mencapai tahap tertentu, tindanan fungsi akan melimpah, menyebabkan ralat program;

(2) Setiap tahap rekursif akan menambah operasi tolak dan pop tindanan tambahan, iaitu, menyimpan pemandangan dan memulihkan pemandangan semasa panggilan fungsi.

Oleh itu, panggilan rekursif harus dielakkan sebaik mungkin.

9. Berkenaan pengasingan skop fail modul.

Apabila Node menyusun fail modul JavaScript, kandungannya telah dibungkus kepala dan ekor, seperti berikut:

(function(exports, require, module, __filename, __dirname){
  你的JavaScript文件代码
});
Ini membolehkan pengasingan skop antara setiap fail modul. Oleh itu, apabila anda menulis fail modul NodeJs, anda tidak perlu menambah sendiri lapisan enkapsulasi pengasingan skop. Format kod berikut hanya menambah lapisan tambahan panggilan fungsi, yang tidak disyorkan:

(function(){
  ... ...
})();
10. Jangan campurkan tatasusunan dan objek

Berikut ialah contoh kod ralat:

var o = [];
o['name'] = 'LiMing';
Mencampur tatasusunan dan objek boleh membawa kepada ralat yang tidak dapat diramalkan. Salah seorang rakan sekerja saya menghadapi masalah yang sangat pelik. Mari lihat kodnya dahulu:

var o = [];
o['name'] = 'LiMing';
var s = JSON.stringify(o);

Dia pada asalnya menyangka bahawa atribut nama objek o akan berada dalam rentetan JSON, tetapi hasilnya tidak. Saya juga sangat terkejut pada masa itu, tetapi saya mempunyai firasat bahawa ia adalah masalah mencampurkan tatasusunan dan objek. Saya mencubanya dan ternyata masalahnya. Kemudian, saya mendapat tahu dalam spesifikasi ECMA bahawa tatasusunan bersiri mengikut peraturan JA. Oleh itu, adalah perlu untuk membangunkan tabiat pengaturcaraan yang baik, menggunakan tatasusunan dan objek dengan betul, dan jangan mencampurkannya.

11. Pengaturcaraan Janji Elegan

Saya percaya bahawa sesiapa sahaja yang telah berhubung dengan nodeJs telah mengalami pengalaman ini Apabila panggilan balik tak segerak disarangkan dalam panggilan balik tak segerak, kod tersebut menjadi mengelirukan dan tidak dapat dibaca. Dilema nodeJs ini boleh diatasi dengan bantuan janji. Janji adalah seperti pengukir, menjadikan kod anda elegan dan cantik. Promise mempunyai spesifikasi A, dan terdapat beberapa kaedah pelaksanaan dalam talian, anda boleh merujuknya.

Kenyataan:
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