บทความแรกนี้จะพูดคุยเกี่ยวกับรายละเอียดการเขียนโปรแกรมบางอย่างของ NodeJs
1. วนซ้ำผ่านอาร์เรย์
สำหรับ (var i = 0, l = arr.length; i <l; i ++)
ข้อดีอย่างหนึ่งของการเขียนด้วยวิธีนี้คือการได้รับความยาวของวัตถุอาร์เรย์โดยขั้นตอนหนึ่งในแต่ละลูป ยิ่งความยาวอาร์เรย์นานเท่าไหร่ค่าก็ยิ่งชัดเจนมากขึ้นเท่านั้น
2. กำหนดความถูกต้องของตัวแปร
if (a) {... } // a = '', a = '0', a = [], a = {}ผลลัพธ์ของการตัดสินตามเงื่อนไขคือ: เท็จจริงจริงจริงจริง ผลลัพธ์นี้แตกต่างจากผลลัพธ์ของ PHP ดังนั้นอย่าสับสน นอกจากนี้ยังจำเป็นต้องแยกแยะระหว่างสถานการณ์ที่คล้ายกับการตัดสินที่ไม่ใช่อัตลักษณ์
3. การตัดสินที่ไม่ใช่อัตลักษณ์ของค่า 0
1 ถ้า (0 == '0') {... } // true2 ถ้า (0 == []) {... } // true3 ถ้า (0 == [0]) {... } // true4 ถ้า (0 == {}) {... } // false5 ถ้า (0 == null) {...ในความเป็นจริงมีการตัดสินที่แปลกประหลาดมากมายและฉันก็ระบุว่าคนทั่วไปมากขึ้นเท่านั้น หากคุณต้องการเข้าใจกฎโปรดดูโพสต์บล็อกอื่นของฉัน: [JavaScript] การวิเคราะห์เชิงลึกของการดำเนินการเชิงสัมพันธ์ของ JavaScript และหากคำสั่ง
4. กับดักของ Parseint
var n = parseint (s); // s = '010'
หลังจากดำเนินการแถลงการณ์ค่า n คือ 8 ไม่ใช่ 10 แม้ว่าหลายคนรู้เรื่องนี้ แต่ก็หลีกเลี่ยงไม่ได้ที่จะมีข้อผิดพลาดในการเขียนโปรแกรมและฉันมีความเข้าใจอย่างลึกซึ้ง ดังนั้นจึงเป็นการดีที่สุดที่จะเขียนด้วยวิธีต่อไปนี้ดังนั้นจะไม่มีข้อผิดพลาด
var n = parseint (s, 10);
5. ต้องประกาศตัวแปรก่อนการใช้งาน
แม้ว่ามันจะไม่ทำผิดพลาดโดยตรงโดยใช้ตัวแปรโดยไม่ต้องประกาศ แต่ก็เป็นเรื่องง่ายที่จะทำผิดพลาดเมื่อเขียนด้วยวิธีนี้ เนื่องจากล่ามแสดงให้เห็นว่ามันเป็นตัวแปรระดับโลกจึงเป็นเรื่องง่ายที่จะทำให้เกิดข้อผิดพลาดโดยการหารด้วยตัวแปรทั่วโลกอื่น ๆ ดังนั้นคุณต้องพัฒนานิสัยที่ดีในการประกาศตัวแปรก่อนที่จะใช้
6. มี async ในวง
สำหรับ (var i = 0, l = arr.length; i <l; i ++) {var sql = "เลือก * จาก nx_user"; db.Query (sql, function () {sys.log (i + ':' + sql);}); //db.Query เป็นการดำเนินการค้นหาตารางซึ่งเป็นการดำเนินการแบบอะซิงโครนัส}คุณจะพบว่าผลลัพธ์ผลลัพธ์เหมือนกันและเป็นเนื้อหาเอาต์พุตเมื่อ i = arr.length-1 เนื่องจาก JavaScript เป็นเธรดเดี่ยวมันจะดำเนินการเนื้อหาแบบซิงโครนัสของลูปที่สมบูรณ์ก่อนที่จะดำเนินการแบบอะซิงโครนัส ฟังก์ชั่นการโทรกลับแบบไม่ระบุชื่อในรหัสเป็นการโทรกลับแบบอะซิงโครนัส เมื่อฟังก์ชั่นถูกเรียกใช้งานสำหรับลูปและการดำเนินการซิงโครไนซ์ที่ตามมาบางส่วนได้ถูกดำเนินการแล้ว เนื่องจากหลักการปิดฟังก์ชั่นนี้จะรักษาเนื้อหาของตัวแปร SQL และตัวแปร I ของลูปสุดท้ายของการวนรอบสำหรับการวนรอบซึ่งจะนำไปสู่ผลลัพธ์ที่ไม่ถูกต้อง
แล้วฉันควรทำอย่างไร? มีสองวิธีแก้ปัญหาหนึ่งคือการใช้ฟังก์ชั่นทันทีดังนี้:
สำหรับ (var i = 0, l = arr.length; i <l; i ++) {var sql = "เลือก * จาก nx_user"; (ฟังก์ชั่น (sql, i) {db.Query (sql, function () {sys.log (i + ':' + sql);}); //db.query เป็นการดำเนินการสืบค้นตารางซึ่งเป็นการดำเนินการแบบอะซิงโครนัส}) (sql, i);};อีกวิธีหนึ่งคือการแยกส่วนการทำงานแบบอะซิงโครนัสและเขียนฟังก์ชั่นเดียวดังนี้:
var outputsql = function (sql, i) {db.Query (sql, function () {sys.log (i + ':' + sql);}); //db.Query เป็นการดำเนินการสืบค้นตารางซึ่งเป็นการดำเนินการแบบอะซิงโครนัส} สำหรับ (var i = 0, l = arr.length; i <l; i ++) {var sql = "เลือก * จาก nx_user"; outputSQL (SQL, I); -7. เมื่อประมวลผลข้อมูลจำนวนมากพยายามหลีกเลี่ยงการทำรังลูป
เนื่องจากเวลาในการประมวลผลของการทำรังลูปจะเพิ่มขึ้นอย่างทวีคูณเมื่อเพิ่มจำนวนข้อมูลจึงควรหลีกเลี่ยงมากที่สุด ในกรณีนี้หากไม่มีวิธีที่ดีกว่ากลยุทธ์ทั่วไปคือการแลกเปลี่ยนพื้นที่สำหรับเวลานั่นคือการสร้างตารางการทำแผนที่แฮชของข้อมูลวัฏจักรรอง แน่นอนว่าจำเป็นต้องมีการวิเคราะห์สถานการณ์เฉพาะ อีกสิ่งหนึ่งที่จะพูดคือวิธีการบางอย่างเป็นห่วงตัวเองเช่น array.sort () (วิธีนี้ควรนำไปใช้กับลูปสองชั้น) ดังนั้นคุณต้องให้ความสนใจเมื่อใช้งาน
8. พยายามหลีกเลี่ยงการโทรซ้ำ
ข้อได้เปรียบของการโทรแบบเรียกซ้ำคือรหัสนั้นกระชับและการใช้งานนั้นง่ายในขณะที่ข้อเสียของมันมีความสำคัญมาก คำอธิบายต่อไปนี้มีดังนี้:
(1) ขนาดของฟังก์ชันสแต็กจะเติบโตเป็นเส้นตรงกับระดับการเรียกซ้ำและฟังก์ชันสแต็กมีค่าขีด จำกัด บน เมื่อการเรียกซ้ำมาถึงเลเยอร์จำนวนหนึ่งฟังก์ชั่นสแต็กจะล้นส่งผลให้เกิดข้อผิดพลาดของโปรแกรม
(2) แต่ละเลเยอร์แบบเรียกซ้ำจะเพิ่มการกดสแต็กเพิ่มเติมและสแต็กการดำเนินการคือคือไซต์ที่ประหยัดและเว็บไซต์กู้คืนในระหว่างการเรียกใช้ฟังก์ชั่น
ดังนั้นควรหลีกเลี่ยงการโทรแบบเรียกซ้ำให้มากที่สุด
9. เกี่ยวกับการแยกขอบเขตของไฟล์โมดูล
เมื่อโหนดรวบรวมไฟล์โมดูล JavaScript เนื้อหาจะถูกห่อหุ้มในตอนต้นและสิ้นสุดดังนี้:
(ฟังก์ชั่น (การส่งออก, ต้องการ, โมดูล, __fileName, __dirName) {รหัสไฟล์ JavaScript ของคุณ});สิ่งนี้ช่วยให้สามารถแยกขอบเขตระหว่างไฟล์โมดูลแต่ละไฟล์ได้ ดังนั้นเมื่อคุณเขียนไฟล์โมดูล NodeJS คุณไม่จำเป็นต้องเพิ่มการห่อหุ้มแยกขอบเขตอีกชั้นหนึ่ง ตัวอย่างเช่นรูปแบบรหัสต่อไปนี้จะเพิ่มเลเยอร์ของการเรียกใช้ฟังก์ชันเพิ่มเติมซึ่งไม่แนะนำ:
(การทำงาน(){ ... …})();10. อย่าผสมอาร์เรย์และวัตถุ
นี่คือตัวอย่างของรหัสข้อผิดพลาด:
var o = []; o ['name'] = 'liming';
อาร์เรย์และวัตถุผสมอาจนำไปสู่ข้อผิดพลาดที่คาดเดาไม่ได้ เพื่อนร่วมงานของฉันพบปัญหาที่แปลกมาก มาดูรหัสก่อน:
var o = []; o ['name'] = 'liming'; var s = json.stringify (o);
เขาคิดว่าแอตทริบิวต์ชื่อของ Object O จะอยู่ในสตริง JSON แต่ผลลัพธ์ก็ไม่มีอะไรเลย ฉันยังแปลกมากในเวลานั้น แต่ฉันมีลางสังหรณ์ว่ามันเป็นปัญหาของการผสมอาร์เรย์และวัตถุ ฉันลองและมันก็เป็นปัญหาแน่นอน ต่อมาฉันพบในข้อกำหนด ECMA ที่อาร์เรย์จะถูกจัดลำดับตามกฎ JA ดังนั้นคุณต้องพัฒนานิสัยการเขียนโปรแกรมที่ดีใช้อาร์เรย์และวัตถุอย่างถูกต้องและอย่าผสม
11. สัญญาการเขียนโปรแกรมที่สง่างาม
ฉันเชื่อว่าคนที่สัมผัสกับ NodeJs มีประสบการณ์นี้ เมื่อการโทรกลับแบบอะซิงโครนัสซ้อนกันในการโทรกลับแบบอะซิงโครนัสรหัสดูเหมือนจะสับสนมากและขาดความง่ายในการอ่าน ภาวะที่กลืนไม่เข้าคายไม่ออกของ NodeJs นี้สามารถเอาชนะได้ด้วยสัญญา สัญญาเป็นเหมือนเครื่องมือแกะสลักที่ทำให้รหัสของคุณสง่างามและสวยงาม มีข้อกำหนด A+ สำหรับสัญญาและมีวิธีการใช้งานหลายวิธีออนไลน์คุณสามารถอ้างถึงได้