Google 和 Airbnb 是目前最流行的 JavaScript 代碼風格,若是你長期使用 JavaScript 來寫代碼的話,建議對比看看。javascript
如下是我認爲在 Google 代碼風格指南中最有意思的十三條規則,和你們分享一下:html
除了行終止符外,在系統文件中,空格是惟一表示空白的字符,這意味着 tab 不能做爲縮進使用。java
這份指南規定用2個空格(而不是4個)來表示縮進。git
// bad function foo() { ∙∙∙∙let name; } // bad function bar() { ∙let name; } // good function baz() { ∙∙let name; } 複製代碼
每一個語句都必須以分號結尾,不要依賴編譯器自動插入分號。github
儘管我沒法理解爲何有人會反對加分號,就像「tab 和 空格」爭論同樣。不管怎麼樣 Google 是站在加分號這邊的。markdown
// bad let luke = {} let leia = {} [luke, leia].forEach(jedi => jedi.father = 'vader') // good let luke = {}; let leia = {}; [luke, leia].forEach((jedi) => { jedi.father = 'vader'; }); 複製代碼
暫時不要用 ES6 模塊化(好比 import 和 export 關鍵字),由於 ES6 模塊化的語法還沒最終肯定。less
// Don't do this kind of thing yet: //------ lib.js ------ export function square(x) { return x * x; } export function diag(x, y) { return sqrt(square(x) + square(y)); } //------ main.js ------ import { square, diag } from 'lib'; 複製代碼
儘可能不要上下對齊代碼,維護成本過高。ide
// bad { tiny: 42, longer: 435, }; // good { tiny: 42, longer: 435, }; 複製代碼
聲明局部變量用 const 或者 let,默認使用 const,除非變量須要從新賦值。模塊化
// bad var example = 42; // good let example = 42; 複製代碼
箭頭函數不只語法簡潔易讀,並且修復了 this 的問題,特別是在嵌套函數中。函數
// bad [1, 2, 3].map(function (x) { const y = x + 1; return x * y; }); // good [1, 2, 3].map((x) => { const y = x + 1; return x * y; }); 複製代碼
用模板字符串(用 ` 分割)處理複雜的字符串,特別是處理多行的字符串。
// bad function sayHi(name) { return 'How are you, ' + name + '?'; } // bad function sayHi(name) { return ['How are you, ', name, '?'].join(); } // bad function sayHi(name) { return `How are you, ${ name }?`; } // good function sayHi(name) { return `How are you, ${name}?`; } 複製代碼
雖然 ES5 是容許這樣作的,可是會帶來詭異的錯誤,並且會對閱讀代碼的人帶來誤導
頗有意思的是,Google 和 Airbnb 的規則截然不同(這裏是 Airbnb 的規則)
// bad (在移動端會出問題) const longString = 'This is a very long string that \ far exceeds the 80 column limit. It unfortunately \ contains long stretches of spaces due to how the \ continued lines are indented.'; // bad (Airbnb 推薦這種寫法,不對長字符串作任何處理。) const longString = 'This is a very long string that far exceeds the 80 column limit. It does not contain long stretches of spaces since the concatenated strings are cleaner.'; // good const longString = 'This is a very long string that ' + 'far exceeds the 80 column limit. It does not contain ' + 'long stretches of spaces since the concatenated ' + 'strings are cleaner.'; 複製代碼
在 ES6 中,支持多種 for 循環寫法,可能你都用過,但儘量選用 for… of 吧。
不要使用 eval() (代碼加載器除外),會帶來潛在的不肯定性,由於在 CSP 環境中沒法工做。
在 MDN中也明確提到了,不用使用 eval()。
// bad let obj = { a: 20, b: 30 }; let propName = getPropName(); // returns "a" or "b" eval( 'var result = obj.' + propName ); // good let obj = { a: 20, b: 30 }; let propName = getPropName(); // returns "a" or "b" let result = obj[ propName ]; // obj[ "a" ] is the same as obj.a 複製代碼
常量用大寫字母加下劃線表示,全部單詞大寫,下劃線分割。
若是你的代碼遵照此規則,可大大增長代碼的可閱讀性,但須要注意的是,若是常量是函數,須要寫成駝峯。
// bad const number = 5; // good const NUMBER = 5; 複製代碼
每次申明一個變量,不要寫成 let a = 1, b = 2;
// bad let a = 1, b = 2, c = 3; // good let a = 1; let b = 2; let c = 3; 複製代碼
普通的字符串用單引號分割(’),若是字符串中包含單引號,那麼考慮用模板字符串。
// bad let directive = "No identification of self or mission." // bad let saying = 'Say it ain\u0027t so.'; // good let directive = 'No identification of self or mission.'; // good let saying = `Say it ain't so`; 複製代碼
本文翻譯自 Daniel Simmons - 《13 Noteworthy Points from Google’s JavaScript Style Guide》