摘要:谷歌和有兩個最受歡迎的編寫風(fēng)格指南。有趣的是,谷歌和不同意這個規(guī)則這是的規(guī)范。谷歌只是眾多科技巨頭之一,這些只是推薦。也就是說,看看谷歌這樣的公司提出的風(fēng)格建議是很有趣的,這家公司雇傭了很多才華橫溢的人,他們花了很多時間編寫優(yōu)秀的代碼。
文中的我指原文的作者
想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你!
對于那些還不熟悉JavaScript的編寫風(fēng)格的人,谷歌提供了編寫JavaScript的編寫風(fēng)格指南,谷歌風(fēng)格指南 其中列出了編寫干凈、可理解代碼的最佳風(fēng)格實踐。
對于編寫有效的JavaScript來說,這些并不是硬性的、快速的規(guī)則,而只是在源文件中維護(hù)一致的、吸引人的樣式選擇的規(guī)則。這對于JavaScript來說尤其有趣,它是一種靈活且多變的語言,允許多種風(fēng)格的選擇。
谷歌和Airbnb有兩個最受歡迎的編寫風(fēng)格指南。如果我的工作是花費大量時間編寫JS,那么可以先學(xué)習(xí)這兩種方法。
以下是谷歌JS風(fēng)格指南中我認(rèn)為最有趣和相關(guān)的13條規(guī)則:
谷歌JS風(fēng)格指南處理各種各樣的問題,從激烈爭論的問題(制表符與空格的比較,以及分號應(yīng)該如何使用這個有爭議的問題),到一些更模糊的規(guī)范,這些規(guī)范令我吃驚,它們肯定會改變我以后寫JS的方式。
對于每個規(guī)則,我將對規(guī)范進(jìn)行總結(jié),然后引用樣式指南中的支持部分,詳細(xì)描述該規(guī)則。在適用的情況下,我還將提供實踐中的樣式示例,并將其與不遵循規(guī)則的代碼進(jìn)行對比。
使用空格,而不是制表符除了行結(jié)束符序列之外,ASCII水平空格字符(0x20)是源文件中出現(xiàn)在任何位置的惟一空格字符。這意味著…制表符不用于縮進(jìn)使用兩個空格(而不是四個)進(jìn)行縮進(jìn)
// bad function foo() { ????let name; } // bad function bar() { ?let name; } // good function baz() { ??let name; }分號是必需的
每個語句必須以分號結(jié)束,禁止依靠自動分號插入。
雖然無法想象為什么會有人反對這個想法,但JS中分號的一致使用正在成為新的“空格對制表符”的爭論。谷歌一慣建議結(jié)束需要使用分號。
// 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 模塊
不要使用ES6模塊(即導(dǎo)出和導(dǎo)入關(guān)鍵字),因為它們的語義還沒有最終確定。注意,一旦語義完全標(biāo)準(zhǔn),將重新定義使用的方式。
// 先別做這種事 //------ 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";不鼓勵(但不禁止)水平對齊
這種做法是允許的,但谷歌編寫風(fēng)格通常不鼓勵這樣做,甚至不需要在已經(jīng)使用它的地方保持水平對齊。
水平對齊是在代碼中添加可變數(shù)量的額外空格,以使某行變量的值與前面變量值對齊。
// bad { tiny: 42, longer: 435, }; // good { tiny: 42, longer: 435, };不要再使用 var 了
使用const或let聲明所有本地變量來代替 var。默認(rèn)情況下使用 const,除非需要重新分配變量在使用 let 聲明。
// bad var example = 42; // good let example = 42;箭頭函數(shù)是首選
箭頭函數(shù)提供了簡潔的語法,并解決了this 在函數(shù)中不確定性的一些問題,與function關(guān)鍵字相比,更喜歡箭頭函數(shù),特別是對于嵌套函數(shù)。
老實說,我只是覺得箭頭函數(shù)很棒因為它們更簡潔,更美觀。事實證明,它們還有一個非常重要的用途。
// 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; });使用模板字符串而不是拼接客串
在復(fù)雜的字符串連接上使用模板字符串(用`分隔),特別是在涉及多個字符串文本時,模板字符串可以跨越多行。
// 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}?`; }不要對長字符串使用 來表示連續(xù)
不要在普通或模板字符串文字中使用連續(xù)行(也就是說,在字符串文字中以反斜杠結(jié)束一行)。盡管ES5允許這樣做,但是如果斜杠后面有任何尾隨空格,那么可能會導(dǎo)致一些棘手的錯誤,而且對讀者來說不太明顯。
有趣的是,谷歌和Airbnb不同意這個規(guī)則(這是Airbnb的規(guī)范)。
雖然谷歌建議連接更長的字符串(如下所示),Airbnb的風(fēng)格指南基本上建議什么也不做,并允許長字符串繼續(xù),只要他們需要。
// bad (sorry, this doesn"t show up well on mobile) 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."; // 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.";for…of 是for 循環(huán)的首選類型
使用ES6,該語言現(xiàn)在有三種不同的for循環(huán)。所有的循環(huán)都可以使用,但是如果可能的話,for-of循環(huán)應(yīng)該是首選的。
如果您問我,這是一個奇怪的問題,但是我認(rèn)為我應(yīng)該包含它,因為谷歌聲明了一種首選的for循環(huán)類型,這非常有趣。
我總覺得 for...in 循環(huán)對于對象更好,而對于for...of 的更適合數(shù)組,不同場景可以使用不同方式。
雖然這里的Google規(guī)范不一定與這個想法相矛盾,但是了解他們特別喜歡這個循環(huán)還是很有趣的。
不要使用eval()不要使用eval或function(…string)構(gòu)造函數(shù)(代碼加載器除外)。這些特性具有潛在的危險,而且在CSP環(huán)境中根本不起作用
MDN 頁面的eval()中,甚至有一個名為“不要使用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常量應(yīng)該用全大寫字母命名,用下劃線分隔
常量名稱使用CONSTANT_CASE的格式:所有大寫字母,單詞由下劃線分隔。
如果您絕對確信某個變量不應(yīng)該更改,那么可以通過將該常量的名稱大寫來表示。這使得在整個代碼中使用該常量時,它的不變性非常明顯。
一個值得注意的例外是,如果常量是函數(shù)作用域的。在這種情況下,應(yīng)該用camelCase來寫。
// bad const number = 5; // good const NUMBER = 5;每次聲明一個變量
每個局部變量聲明只聲明一個變量:聲明如令a = 1, b = 2,不推薦。
// bad let a = 1, b = 2, c = 3; // good let a = 1; let b = 2; let c = 3;使用單引號,而不是雙引號
普通的字符串用單引號(")分隔,而不是雙引號(")。
提示:如果字符串包含單引號字符,可以考慮使用模板字符串來避免轉(zhuǎn)義引號。
// bad let directive = "No identification of self or mission." // bad let saying = "Say it ainu0027t so."; // good let directive = "No identification of self or mission."; // good let saying = `Say it ain"t so`;最后一個注意
正如我在開始時所說,這些不是強(qiáng)制要求。谷歌只是眾多科技巨頭之一,這些只是推薦。
也就是說,看看谷歌這樣的公司提出的風(fēng)格建議是很有趣的,這家公司雇傭了很多才華橫溢的人,他們花了很多時間編寫優(yōu)秀的代碼。
如果你想要遵循“符合谷歌的源代碼”的指導(dǎo)原則,那么你可以遵循這些規(guī)則—但是,當(dāng)然,許多人不同意這些規(guī)則,你可以隨意忽略這些規(guī)則中的任何一個或所有規(guī)則。
我個人認(rèn)為在很多情況下Airbnb的規(guī)范比谷歌更有吸引力。無論您對這些特定的規(guī)則采取何種立場,在編寫任何類型的代碼時,始終牢記風(fēng)格一致性仍然很重要。
原文:13 Noteworthy Points from Google’s JavaScript Style Guide
你的點贊是我持續(xù)分享好東西的動力,歡迎點贊!
交流干貨系列文章匯總?cè)缦拢X得不錯點個Star,歡迎 加群 互相學(xué)習(xí)。
https://github.com/qq44924588...
我是小智,公眾號「大遷世界」作者,對前端技術(shù)保持學(xué)習(xí)愛好者。我會經(jīng)常分享自己所學(xué)所看的干貨,在進(jìn)階的路上,共勉!
關(guān)注公眾號,后臺回復(fù)福利,即可看到福利,你懂的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/53374.html
摘要:谷歌和有兩個最受歡迎的編寫風(fēng)格指南。有趣的是,谷歌和不同意這個規(guī)則這是的規(guī)范。谷歌只是眾多科技巨頭之一,這些只是推薦。也就是說,看看谷歌這樣的公司提出的風(fēng)格建議是很有趣的,這家公司雇傭了很多才華橫溢的人,他們花了很多時間編寫優(yōu)秀的代碼。 showImg(https://segmentfault.com/img/bV7pRb?w=2000&h=800); 文中的我指原文的作者 想閱讀更多...
摘要:月號以后,我就要從谷歌離職了。最后,其實谷歌的薪水也還是不錯的。根據(jù)我在谷歌簽署的保密協(xié)議,有一些數(shù)據(jù)我是不能對外披露的,包括一些可能收到這些數(shù)據(jù)影響的想法也不行,所以我必須得小心了。 3月17號以后,我就要從谷歌離職了。原因在于我不可能搬到加州,谷歌也不會在溫哥華開個分公司。所以當(dāng)你面對一個不可調(diào)和的矛盾時候,能夠和平分手也許是個還不錯的決定了。只是我還沒決定下一步我該怎么走。讓我們...
摘要:形成鮮明對比的是大洋彼岸的谷歌云并非如此低調(diào)。對比已被亞馬遜宣稱成為營收主力谷歌云的地位確實有不小落差。一言以蔽之有了廣告業(yè)務(wù)這個收入引擎谷歌董事會們并沒有指望云計算能給他們賺多少錢。2017年,對想要在中國落地的海外云服務(wù)商來說,可能是最艱難的一年。一方面,《網(wǎng)絡(luò)安全法》正式實施,政府加強(qiáng)了對海外服務(wù)商數(shù)據(jù)的管控,中國用戶的數(shù)據(jù)必須交由本土公司運營;另一方面,工信部加強(qiáng)了對云服務(wù)商營業(yè)資質(zhì)...
摘要:前端技術(shù)日新月異,在你鞏固底層技能的同時,別忘了還要跟上前沿技術(shù)的發(fā)展步伐。你可以從谷歌的博客中了解更多相關(guān)信息。令我驚訝的是,谷歌所有地方在非常簡單的頁面上都沒有搜索欄。快速發(fā)布預(yù)覽零配置打包工具。快速啟動新的工具。 Web 前端技術(shù)日新月異,在你鞏固底層技能的同時,別忘了還要跟上前沿技術(shù)的發(fā)展步伐。 本期刊專注于 Web 前端前沿技術(shù),收集的內(nèi)容來自國外各大前端技術(shù)周刊,這里把值得...
摘要:前端技術(shù)日新月異,在你鞏固底層技能的同時,別忘了還要跟上前沿技術(shù)的發(fā)展步伐。你可以從谷歌的博客中了解更多相關(guān)信息。令我驚訝的是,谷歌所有地方在非常簡單的頁面上都沒有搜索欄。快速發(fā)布預(yù)覽零配置打包工具。快速啟動新的工具。 Web 前端技術(shù)日新月異,在你鞏固底層技能的同時,別忘了還要跟上前沿技術(shù)的發(fā)展步伐。 本期刊專注于 Web 前端前沿技術(shù),收集的內(nèi)容來自國外各大前端技術(shù)周刊,這里把值得...
閱讀 3785·2023-04-26 02:07
閱讀 3671·2021-10-27 14:14
閱讀 2859·2021-10-14 09:49
閱讀 1624·2019-08-30 15:43
閱讀 2611·2019-08-29 18:33
閱讀 2369·2019-08-29 17:01
閱讀 915·2019-08-29 15:11
閱讀 582·2019-08-29 11:06