Node編碼規範

来源:https://www.cnblogs.com/z937741304/archive/2019/03/18/10553060.html
-Advertisement-
Play Games

編碼規範 1. 縮進 採用2個空格縮進,而不是tab縮進。空格在編輯器中與字元是等寬的,而tab可能因編輯器的設置不同。2個空格會讓代碼看起來緊湊、明快。 2. 變數聲明 永遠用var聲明變數,不加var時會將其變為全局變數,這樣可能會意外污染上下文,或是被意外污染。在ECMAScript5的scr ...


編碼規範

1. 縮進

採用2個空格縮進,而不是tab縮進。空格在編輯器中與字元是等寬的,而tab可能因編輯器的設置不同。2個空格會讓代碼看起來緊湊、明快。

2. 變數聲明

永遠用var聲明變數,不加var時會將其變為全局變數,這樣可能會意外污染上下文,或是被意外污染。在ECMAScript5的scrict模式下,未聲明的變數將會直接拋出ReferenceError異常。

需要說明的是,每行聲明都應該帶上var,而不是只有一個var,示例代碼如下;

1 var assert = require('assert'); 
2 var fork = require('child_process').fork; 
3 var net = require('net'); 
4 var EventEmitter = require('events').EventEmitter; 

 

錯誤的示例如下所示:

1 var assert = require('assert') 
2   , fork = require('child_process').fork 
3   , net = require('net') 
4   , EventEmitter = require('events').EventEmitter; 

3. 空格

  在操作符前後需要加空格,比如 +、-、*、%、=等操作符前後都應該存在一個空格,示例如下:

1 var foo = 'bar' + baz; 

  錯誤的示例如下所示:

1 var foo='bar'+baz; 

  此外,在小括弧的前後應該存在空格,如:

1 if (true) { 
2   // some code 
3 } 

  錯誤的示例如下所示:

1 if(true){ 
2   // some code 
3 } 

 

4. 單雙引號的使用

  由於雙引號在別的場景下使用較多,在Node中使用字元串時儘量使用單引號,這樣無需轉義,如:

1 var html = '<a href="http://cnodejs.org">CNode</a>'; 

而在JSON中,嚴格的規範是要求字元串用雙引號,內容中出現雙引號時,需要轉義。

5. 大括弧的位置

  一般情況下,大括弧無需另起一行,如

1 if (true) { 
2   // some code 
3 } 

  錯誤的示例如下所示:

1 if (true) 
2 { 
3   // some code 
4 } 

6. 逗號

  逗號用於變數聲明的分割或是元素的分割。如果逗號不在行結尾,前面需要一個空格。此外逗號不允許出現在行首,比如:

var foo = 'hello', bar = 'world'; // 或是 var hello = { foo: 
'hello', bar: 'world' }; // 或是 var world = ['hello', 'world'];

  錯誤的示例如下所示:

 1 var foo = 'hello' 
 2   , bar = 'world'; 
 3 // 或是
 4 var hello = {foo: 'hello' 
 5   , bar: 'world' 
 6 }; 
 7 // 或是
 8 var world = [ 
 9   'hello' 
10   , 'world' 
11 ]; 

7. 分號

  給表達式結尾加根號。儘管Javascript編譯器會自動給行尾添加分號,但還是會帶來一些誤解,示例如下:

1 function add() { 
2   var a = 1, b = 2 
3   return 
4   a + b 
5 } 

  將會得到undefined的返回值。因為自動加入分號會變成如下的樣式:

1 function add() { 
2   var a = 1, b = 2; 
3   return; 
4   a + b; 
5 } 

  後續的a + b將不會執行。

  而如下的代碼:

x = y 
(function () { 
}()) 
// 執行時會得到
x = y(function () {}()) 

  由於自動添加分號可能會帶來未預期的結果,所以添加上分號有助於避免誤會。

命名規範

  在編碼過程中,命名是重頭戲。好的命名可以令代碼賞心悅目,帶來愉悅的閱讀享受,令代碼具有良好的可維護性。命令的主要範疇有變數、常量、方法、類、文件、包等。

1. 變數命名

  變數名都採用小駝峰式命名,即除了第一個單詞的首字母不大寫外,每個單詞的首字母都大寫,詞與詞之間沒有任何特殊符號,如:

1 var adminUser = {}; 

  錯誤的示例如下:

1 var admin_user = {}; 

2. 方法命名

  方法命名與變數命名一樣,採用小駝峰式命名。與變數不同的是,方法名儘量採用動詞或判斷行辭彙,如:

1 var getUser = function () {}; 
2 var isAdmin = function () {}; 
3 User.prototype.getInfo = function () {}; 

  錯誤的示例如下:

1 var get_user = function () {}; 
2 var is_admin = function () {}; 
3 User.prototype.get_info = function () {}; 

3. 類命名

  類名採用大駝峰式命名,即所有單詞的首字母都大寫,如:

1 function User(){  
2 }

4. 常量命名

  作為常量時,單詞的所有字母都大寫,並用下劃線分割,如:

1 var PINK_COLOR = "pink"; 

5. 文件命名

  命名文件時,請儘量採用下劃線分割單詞,比如child_process.js和string.decode.js。如果你不想將文件暴露給其他用戶,可以約定以下劃線開頭,如_linklist.js

6. 包名

  如果你有貢獻模塊並將其打包發佈到NPM上。在包名中,儘量不要包含js或node的字樣,它是重覆的。包名應當適當短且有意義的,如:

1 var express = require('express'); 

比較操作

  在比較操作中,如果是無法容忍的場景,請儘量使用 === 代替 ==,否則你會遇到下麵這河陽不符合邏輯的結果:

1 '0' == 0; // true 
2 '' == 0 // true 
3 '0' === '' // false 

  此外,當判斷容忍假值時,可以無需使用 === 或 ==。在下麵的代碼中,當foo是0、undefined、null、false、‘ ’ 時,都會進入分支:

1 if (!foo) { 
2   // some code 
3 } 

字面量

  請儘量使用{}、[]代替new Object()、new Array(),不要使用string、bool、number對象類型,即不要使用new String、new Boolean 和 new Number。

作用域

  在JavaScript中,需要註意一個關鍵字和一個方法,它們是with和eval(),容易引起作用域混亂。

1. 慎用with

  示例代碼如下:

1 with (obj) { 
2   foo = bar; 
3 }

  它的結果有可能是如下四種之一:obj.foo = obj.bar; 、obj.foo = bar;、 foo = bar;、 foo = obj.bar;,這些結果取決於它的作用域。如果作用域鏈上沒有導致衝突的變數存在,使用它則是安全的。但在多人合作的項目中,這並不能保證,所以要慎用with。

2. 慎用eval

 

數組與對象

在JavaScript中,數組其實也是獨享,但是兩者在使用時有些細節需要註意。

1.字面量格式

  創建對象或者數組時,註意在結尾用逗號分隔。如果分行,一行只能一個元素,示例代碼如下:

1 var foo = ['hello', 'world']; 
2 var bar = { 
3   hello: 'world', 
4   pretty: 'code' 
5 }; 

  錯誤示例如下所示:

1 var foo = ['hello', 
2 'world']; 
3 var bar = { 
4   hello: 'world', pretty: 'code' 
5 }; 

2.for in 迴圈

  使用for in迴圈時,請對對象使用,不要對數組使用,示例代碼如下:

1 var foo = []; 
2 foo[100] = 100; 
3 for (var i in foo) { 
4   console.log(i); 
5 } 
6 for (var i = 0; i < foo.length; i++) { 
7   console.log(i); 
8 } 

在上述代碼中,第一個迴圈只列印一次,而第二個迴圈則列印0~100,這並不滿足預期的值。

3.不要把數組當做對象使用

  儘管在JavaScript內部實現中可以把數組當做對象來使用,如下所示:

1 var foo = [1, 2, 3]; 
2 foo['hello'] = 'world'; 
3 這在for in迭代時,會得到所有值
4 for (var i in foo) { 
5   console.log(foo[i]); 
6 } 
7 也許你只是想得到hellow而已。

非同步

在Node中,非同步使用非常廣泛並且在實踐過程中形成了一些約定,這是以往不曾在意的點。

1.非同步回調函數的第一個參數應該是錯誤指示

  並不是所有的回調函數都需要將第一個參數設計為錯誤對象,但是一旦涉及非同步,將會導致try catch無法捕獲到非同步回調期的異常。將第一個參數設計為錯誤對象,告知調用方是一個不錯的約定。示例代碼如下。

1 function(err, data){
2 };

這個約定被很多流程式控制制庫所採用。遵循這個約定,可以享受社區流程式控制制庫帶來的業務編寫遍歷。

2.執行傳入的回調函數

  在非同步方法中一旦有回調函數傳入,就一定要執行它,且不能多次執行。如果不執行,可能造成調用一直等待不結束,多次執行也可能會造成未預期的結果。

類與模塊

關於如何在JavaScript中實現繼承,有各種各樣的方式,但在Node中我們只推薦一種,那就是類繼承的方式。另外,在Node中,如果要將一個類作為一個模塊,就需要在意它的導出方式。

1.類繼承

 一般情況下,我們採用Node推薦的類繼承方式,示例代碼如下:

1 function Socket(options) { 
2   // ... 
3   stream.Stream.call(this); 
4   // ... 
5 } 
6 util.inherits(Socket, stream.Stream); 
  1. 導出

    所有供外部調用的方法或變數均需掛載在exports變數上。當需要將文件做一個類導出時,需要通過如下的方式掛載:

1 module.exprots = Class; 

而不是通過
1 exports = Class; 

  私有方法無需因為測試等原因導出給外部,所以無需掛載。

註釋詳解

  一般情況下,我們會對每個方法編寫註釋,這裡採用dox的推薦註釋,示例如下:

 1 /** 
 2   * Queries some records 
 3   * Examples: 
 4   * ``` 
 5   * query('SELECT * FROM table', function (err, data) { 
 6   * // some code 
 7   * }); 
 8   * ``` 
 9   * @param {String} sql Queries 
10   * @param {Function} callback Callback 
11   */ 
12 exports.query = function (sql, callback) { 
13   // ... 
14 }; 

 

  dox的註釋規範來自與JSDoc。可以通過註釋生成對應的API文檔。

  本文摘抄自 樸靈的深入淺出Node.js一書,感覺還不錯,在此分享。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文章大綱 一、頁面路由基本介紹1.什麼是頁面路由2.為什麼要使用頁面路由二、頁面路由框架ARouter介紹1.常用功能介紹2.常見應用場景三、源碼下載四、參考文章 一、頁面路由基本介紹 1.什麼是頁面路由 映射頁面跳轉關係,包含跳轉相關的URL跳轉及值傳遞、攔截器等功能。 2.為什麼要使用頁面路由 ...
  • 簡寫:JavaScript-JS ECMAScript-ES 寫在前面的話:啃文字大多時間不是件愉快的事情,但是我們必須過這個坎,讓自己習慣,讓自己不討厭,至於喜歡不喜歡,我們等時間給出答案。 JavaScript由來JavaScript 誕生於1995年,由Netscape Navigator(網 ...
  • 前段時間記錄一下fab 菜單實現之前傳-鐘錶表盤,今天終於弄正文了。 本文基於上篇文章的佈局方式和位置計算,並參考35 Cool Floating Action Button Animations(https://codepen.io/vineethtr/pen/ZbapVR)這篇筆記的動畫實現了環 ...
  • css要實現常見的自適應兩列佈局的方式方法挺多。 這裡講的是利用設置overflow不為visible時會形成新的BFC來實現。至於什麼是BFC,可以搜搜看先,基本都講的差不多了。等有更多空餘時間,專門給講講BFC以及實例的東西。就這樣吧,上代碼: 註意代碼中最長的那行(37行),這裡的文本不是英文 ...
  • node簡介 node.js也是用js開發的語言,而且是一門服務端語言,更有大神利用node寫了一個操作系統出來——NodeOS node能幹什麼 自帶下載工具: 對於我們開發前端項目,node其實用處挺大的,它自帶了一個包管理器npm,類似於Python的pip,這個npm就可以下載很多第三方庫... ...
  • /* *@url --string下載路徑 *@filename --string文件名稱*/ downLoadProcess(url,filename){ filename = filename || 'xxx.csv'; // 創建xhr對象 var req = new XMLHttpReque ...
  • 共有三種方法: 1.結合 vue-axios使用 首先在主入口文件main.js中引用 之後就可以在組件文件中的methods里去使用了 2. axios 改寫為 Vue 的原型屬性 首先在主入口文件main.js中引用,之後掛在vue的原型鏈上 在組件中使用 3.結合 Vuex的action 在v ...
  • chapter08 數組的擴展 8.1 擴展運算符 8.1.1 擴展運算符的含義 如同rest運算符的逆運算,將一個數組轉換為用逗號分隔的參數序列。 8.1.2 代替數組的apply方法 apply方法可以將數組轉為函數的參數 8.1.3 擴展運算符的應用 合併數組 與解構賦值相結合 註意:如果擴展 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...