谷歌與Airbnb的JS代碼規範

谷歌JS代碼規範

規範代碼緣由:代碼規範是爲了保持源代碼編寫模式一致,便於維護代碼,可讀性高。html

一、使用空格代替tab

規範隨後指出應該使用2個,而不是4個空格帶實現縮進。(除了每一行的終止符序列,ASCII水平空格符(0x20)是惟一一個能夠出如今源文件中任意位置的空格字符)node

 

二、不能省略分號

每一個語句必須以分號結尾。不容許依賴於JS自動添加分號的功能。分號是必須的,是不可省略的。es6

二、不推薦代碼水平對齊

對代碼進行水平對齊會在代碼中添加若干多餘的空格,這讓相鄰兩行的字符看上去處於一條垂直線上。數組

三、杜絕var

使用const或let來聲明全部局部變量。若是變量不須要被從新賦值,默認應該使用const。應該拒絕使用關鍵字var。ide

四、優先使用箭頭函數

箭頭函數提供了一種簡潔的語法,而且避免了一些關於this指向的問題。相比較與function關鍵字,開發者應該優先使用箭頭函數來聲明函數,尤爲是聲明嵌套函數。函數

五、使用模板字符串取代鏈接字符串

在處理多行字符串時,模板字符串比複雜的拼接字符串要表現的更出色。ui

六、不要使用續行符分割長字符串

在JS中,\也表明着續行符。(儘管ES5中容許這麼作,但若是在\後跟着某些結束空白符,這種行爲會致使一些錯誤,而這些錯誤在審閱代碼時很難注意)this

 oogle推薦下面這樣的寫法,而Airbnb則認爲應該順其天然,不作特殊處理,該多長就多長spa

七、優先使用for...of

之前我認爲for...in適合遍歷Object,而for...of適合遍歷數組。由於我喜歡這種各司其職的使用方式。.net

儘管Google的規範與這種使用方式相沖突,但Google對for...of的偏心依然讓我以爲十分有趣。

八、不要使用eval語句

除非是在code loader中,不然不用使用eval或是Function(...string)結構。這個功能具備潛在的危險性,而且在CSP環境中沒法起做用。

九、常量的命名規範

常量命名應該使用全大寫格式,並用下劃線分割

若是你肯定必定以及確定一個變量值之後不會被修改,你能夠將它的名稱使用全大寫模式改寫,暗示這是一個常量,請不要修改它的值。

遵照這條規則時須要注意的一點是,若是這個常量是一個函數,那麼應該使用駝峯式命名法。

十、每次只聲明一個變量

每個變量聲明都應該只對應着一個變量。不該該出現像let a = 1,b = 2;這樣的語句。

 

十一、使用單引號

只容許使用單引號包裹普通字符串,禁止使用雙引號。若是字符串中包含單引號字符,應該使用模板字符串。

十二、暫時不要使用ES6 module

因爲ES6模塊的語義尚不徹底肯定,因此暫時不要使用,好比export和import關鍵字。一旦它們的相關規範制定完成,那麼請忽略這一條規則。

 

 

總結

以上代碼規範僅供參考,Airbnb的代碼規範比Google的代碼規範,選擇你腦海中時刻遵照的一份代碼規範便可。

 

Airbnb Javascript 代碼規範重要點總結es6

1.對全部的引用使用 const 而非 var。這能確保你沒法對引用重複賦值。

   當須要變更引用時,使用let。

 const和let都是塊級做用域。

2.建立對象的方式: 

  const item = {};

  使用對象屬性的簡寫,且爲簡寫的屬性分組。

3.建立數組的方式:

  const arr = [ ];

  使用arr.push()去替代直接賦值。

  使用拓展運算符去賦值數組: arrCopy = [...arr];

  使用Array.from()把一個類數組對象轉換成數組:

    const foo = document.querySelectorAll('.foo');

    const nodes = Aarry.from(foo);

4.解構:

  使用解構存取和使用多屬性對象:

function getFullName({ firstName, lastName }) { return `${firstName} ${lastName}`; }

  對數組也使用解構賦值:

const arr = [1, 2, 3, 4]; const [first, second] = arr; // 等同於first = arr[0],second = arr[1]

  返回多個值時使用對象解構:這樣不用在乎屬性的順序

複製代碼
function returnInput (input) { ... return { left, right, top, bottom }; } const { left, right } = processInput(input);
複製代碼

5.Strings

  程序化生成字符串時,使用模板字符串代替字符串連接

function sayHi(name) { return `How are you, ${name}?`; }

6.函數

  使用函數聲明代替函數表達式

function foo() { }

  當即調用的函數表達式:

(()=> { console.log('Welcome to the Internet. Please follow me.'); })();

  永遠不要在非函數代碼塊(if,while)中聲明一個函數,把那個函數賦給一個變量。

複製代碼
let test; if (current) { test = () => { ... }; }
複製代碼

  不要使用arguments,能夠選擇rest語法...替代。rest是一個真正的數組,且能明確你要傳入的參數

function cont(...args) { return args.join(''); }

  直接給函數的參數指定默認值,不要使用一個變化的函數參數

function fn(opts = {}) {...}

7.構造器

  老是使用class,避免直接操做prototype。

  使用extends繼承。

  方法能夠返回this來幫助鏈式調用。

8.模塊

  老是使用模組(import/export)而非其餘非標模塊系統。

import { es6 } from './AirbnbStyleGuide'; export default es6; 

  不要使用通配符import以確保只有一個默認export

  不要從import中直接export

9.迭代器

  使用高階函數如map()/reduce()去替代for-of

const number = [1, 2, 3, 4, 5]; const sum = numbers.reduce((total, num) => total + num, 0); sum === 15; ...

10.屬性

  使用 . 訪問對象的屬性。

  當經過變量訪問屬性時使用中括號[]  

11.變量

  一直使用const來聲明變量以防止全局污染,且用const爲每個變量聲明。

  將全部的const和let分組。

12.提高

  使用let和const不會被提高,因此必須聲明在前面。

  匿名函數的表達式的變量名會被提高可是函數內容不會

  命名的函數表達式的變量名會被提高,可是函數名和函數內容不會

  函數聲明的名稱和哈你數體都會被提高。

  以上和js的解析機制有關。

13.優先使用 === 和 !==  而非 == / !=

  條件表達式中:

    對象被計算爲true

    undefined / null 都爲false

    數字除  +0 / -0 / NaN 外 都爲true

    字符串除‘ ’外都爲true

14.代碼塊

  使用大括號包裹全部的多行代碼塊,單行沒必要。

15.註釋

  使用/**...*/做爲多行註釋

  使用//做爲單行註釋,在評論對象上另起一行,且在註釋前插入空行

  使用 // FIXME 標註問題

  使用 // TODO 標註問題的解決方式

16.空格

  在塊末和新語句前插入空行

17.類型轉換

  字符串:不要使用 + ‘ ’

// => this.reviewScore = 9; const totalScore = String(this.reviewScore);

  數字:使用parseInt,並帶上轉換類型的基數

複製代碼
const inputValue = '4'; const val = Number(inputValue); // 或者 const val = parseInt(inputValue, 10);
複製代碼

  布爾:

複製代碼
const age = 0; const hasAge = Boolean(age); // 或者 const hasAge = !!age;
複製代碼

18.命名規則

  使用帕斯卡式命名構造函數或類

  不要使用下劃線結尾或開頭來命名屬性和方法

  不要保存this的引用。使用箭頭函數或Function#bind

  若是文件只輸出一個類,那你的文件名必須和類名徹底保持一致(帕斯卡式)

  若是文件導出默認的函數,文件名與該函數名一致。(駝峯式)

19.存取器

  屬性的存取函數不是必須的

  使用getValue()和setValue('...')

  若是屬性是布爾值,使用isVal() 或 hasVal()

 

 

 

以上總結是借用他人文章總結,若是做者介意,請聯繫我。能夠刪除。

 

原文出處:https://www.cnblogs.com/yaosusu/p/11317579.html

相關文章
相關標籤/搜索