用空格還是用 Tab 鍵?Google 推出《JavaScript 指南》解答程式白痴問題!

Google 的工程師大大為了幫助剛入手 JavaScript 者寫出乾淨、易懂的代碼,提供了一個獨具特色的教程《JavaScript 指南》,而本文作者丹尼爾西蒙斯,一位 web 開發人員/Java愛好者精心總結了Google 推出的這份指南中最有趣、最有用的十三條規則。
評論
評論

本篇來自合作媒體 36kr,原文來自 Medium 標題「google publishes a javascript style guide here are some key lessons」。

Google 的工程師大大為了幫助剛入手 JavaScript 者寫出乾淨、易懂的 code,提供了一個獨具特色的教學《JavaScript 指南》,而本文作者丹尼爾西蒙斯,一位 web 開發人員/Java 愛好者精心總結了 Google 推出的這份指南中最有趣、最有用的十三條規則。

JS 具有強大的靈活性和包容性,因此,JS 的編寫具有不同的風格,因此如何保證你的原始碼在編寫過程中保持著統一的風格才是編寫 JS 的過程中需要注意的。

Google 和 Airbnb 使用著兩種最流行的編寫規則,它們對細節的把關深深的影響著我,從一個個的標點到頁面的佈局,扣著一個個的小細節,這也深深的影響了我在寫 JS 過程中的一些習慣。以下是我挑選的 Google JS 指南中最有趣、有用的十三條規則。

我將針對每一個規則都會給一個總體的敘述,然後再進行詳細的敘述,結合自身的開發經歷,給出一些實用的介紹,如果條件允許,還有一些相關的例子給大家分享一下。

用空格還是用 Tab 鍵?

除了行終止符之外,ASCII 字符 (0x20) 是在原始檔案中出現的唯一空白字符。這意味著 Tab 鍵不用於縮排。

因此,你應該使用空格來實現你的設計而不是 Tab 鍵,而且只要鍵入兩個空格就可以,而不是四個空格。

// bad function foo() { ∙∙∙∙let name; }  // bad function bar() { ∙let name; }  // good function baz() { ∙∙let name; }

必不可少的分號

每個語句都必須以分號結束。不要為了省事使用自動分號插入。那會給你帶來後面很多不必要的麻煩的。

// bad let luke = {} let leia = {} [luke, leia].forEach(jedi => jedi.father = 'vader')
// good let luke = {}; let leia = {}; [luke, leia].forEach((jedi) => {   jedi.father = 'vader'; });

雖然我無法想像為什麼有人反對這個想法,但在 JS 中使用分號正在成為一種新的「空格與 Tab 鍵」的爭論。Google 是支援使用分號的,至於剛入行的還是建議跟著潮流走。

不要使用 ES6 模板

不要使用 ES6 模塊 (即導出和輸入關鍵字),因為它們的語義還沒有最終確定。

// Don't do this kind of thing yet:
<em class="markup--em markup--pre-em">//------ lib.js ------</em> export function square(x) { return x * x; } export function diag(x, y) { return sqrt(square(x) + square(y)); } <em class="markup--em markup--pre-em">//------ main.js ------</em> import { square, diag } from 'lib';

中立態度的水平對齊

在 Google 提供的模板裡面,水平對齊並沒有提出很高的要求,還是比較隨意的。

水平對齊就是在目標模塊的周邊增加可變量的額外空格,使得目標出現在我們想讓他出現的位置上就可以。

// bad {   tiny:   42,     longer: 435,  };
// good {   tiny: 42,    longer: 435, };

不要使用 var 關鍵字

除非需要重新分配一個變量,否則將所有本地變量聲明為 const 關鍵字或 let 型。默認情況下使用 const。但是在使用 var 關鍵字的時候一定要慎重。

其實在平時學習中,我仍然看到人們在 StackOverflow 和其他地方的 code 示例中使用 var 型。我不知道其他人使用 var 是因為什麼,可能這只是一種老習慣垂死掙扎吧。

首選箭頭

個人感覺箭頭函數已經提供了簡潔的語法,並解決了許多困難。所以個人更喜歡箭頭函數而不是函數關鍵字,特別是巢狀函數。

說實話,我認為箭頭不僅功能很好,而且它們更簡潔,更美觀。而且,事實證明,它們也有很重要的作用。、

// 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 允許這樣做,但如果在斜杠之後出現任何尾隨空格,那麼它就會導致棘手的錯誤,而且對新手來說不太明顯。

// 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.';

有趣的是,這是 Google 和 Airbnb 意見不同的規則 ( 這是 Airbnb 的規範 )。雖然 Google 推薦連接更長的字符串 (如下所示),但 Airbnb 的風格指南建議基本上什麼都不做,並且允許長字符串在需要的時候繼續使用。

// 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 循環”的首選類型

在 ES6 中,語言現在有三種不同的 for 循環。工程師是可以使用所有的循環,但在可能的情況下應該首選 for-of 循環。

我個人感覺 for 更適合於對象,而 for of 更適合於數組。只是適合不同的風格。雖然 Google 的規範並不一定與這個想法相矛盾,但是,可以看出 Google 對於這個迴圈還是情有獨鍾的。

不要使用 eval()

不要使用 eval 或函數 (…string) 構造函數 (程式碼載入器除外)。這些特性可能是危險的,在 CSP 環境中根本不起作用。

eval() 的 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

常數應該以全部大寫命名,並且以底線分隔。

常數名稱使用類似於 CONSTANT_CASE 的表示方法: 所有大寫字母,用底線隔開。

如果可以絕對確定變量不改變,就可以使用常數來定義,這樣也可以表示某個變量在整個過程中不會發生改變。

這個規則的一個特例就是,如果這個變量是函數特有的話,最好是申名在函數的空間裡面。

每個變量獨立對待

這沒有什麼好介紹的,直接上 code:

// bad const number = 5;
// good const NUMBER = 5;

特別注意使用單引號,而不是雙引號

普通的字符串是用單引號 (‘) 來分隔的,而不是雙引號 (")。

提示: 如果字符串包含單引號字符,請考慮使用模板字符串,以避免誤導。

// bad let a = 1, b = 2, c = 3;
// good let a = 1; let b = 2; let c = 3;

 

最後的總結

正如我一開始所說的,這些不是唯一的標準。Google 只是眾多科技巨頭中的一個,而這些只是眾多工程師總結出來的經驗而已。

看看 Google 這樣的公司提出的風格建議還是比較有意義的,它僱傭了很多聰明的人,他們花了大量時間研究如何編寫優秀的代碼。

如果你想遵循「Google 相容的開源碼」的指導方針,你可以遵循這些規則——但是,你要是有自己的喜好,那很棒,你可以自由地放飛自我。

我個人認為,在很多情況下,Airbnb 的規範比 Google 更有吸引力。不過無論對這些特定的規則採取何種立場,我們在編寫任何類型的代碼時,唯一的要求就是要保持風格上的一致性。


疫情升溫!台灣各行各業加速數位化,機動應變與全民齊心抗疫

評論
Photo Credit: 新聞資料
評論

國內本土確診病例接連創下新高,全台防疫警戒更進入第三級,自疫情蔓延後,台灣面臨到前所未有的防疫挑戰。回想 2020 年疫情剛爆發時,便引起不少民眾恐慌,各行各業紛紛提出應對措施,避免人群接觸的同時,也帶動了數位轉型興起,而台灣各行業又如何在此次疫情升溫之際,加速線上化及機動應對,成為民眾在非常時期的防疫助力?

疫情猛爆嚇壞人!線上化、數位化服務維持民眾日常

身為防疫模範生的台灣,第一次進入前所未有的防疫警戒階段,去年在國外疫情險峻之時,許多企業和商家紛紛提出了防疫措施,如全球電商巨擘 Amazon 對員工制定嚴格的社交距離規範,並利用 AI 技術監督每個員工間的距離;在消費者端也減少原訂檔期的行銷操作,確保消費者能夠專注於購買民生用品、維持生活需求。

至於國內業者,為了鼓勵民眾待在家,連鎖餐飲業者貳樓餐廳也推出了網路預訂外帶自取五折的優惠;銀行業如華南銀行也推出「宅金融」服務,包括線上貸款、線上智能理財,減少民眾出門的風險。針對生活必需品,電商提供的零接觸服務更成為防疫的一大助力,但當疫情來得又快又急,如何應對才能及時提供民眾所需、成為民眾在疫情間的後盾?

疫情攪亂計劃,品牌滾動式調整與民眾共同防疫

突如其來的疫情對許多品牌造成影響,在電商上的滾動式調整更是頻繁,往年 6 月是電商大檔,中國大陸的 618 購物節正如火如荼地開打,大陸電商龍頭如京東、阿里巴巴、小米線上平台自 5 月 24 日起便摩拳擦掌進行各種狂歡行銷,台灣如蝦皮、MOMO、松果購物等等也持續 618 大檔。而台灣目前處在疫情中,也還是有觀察到許多品牌化危機為轉機,調整了預定的檔期,如 PChome 24h購物機動性將向來最重要的品牌週年慶,直接轉型為「生日不過,疫情快過」,同時致敬這段時間最辛苦的第一線醫護人員、消防、警察及物流人員等,將生日祝福轉為一起祈福,堅持全台配送,不分區不間斷,與大家站在一起守護台灣,祈禱疫情盡快過去,台灣能夠恢復日常的生活。在這個時刻,品牌最重視同島一命,堅持與大家一起度過難關。

目前正值618購物節之電商大檔期。/Photo Credit: 新聞資料
PChome 24h購物因應疫情,將籌備已久的生日週年慶轉型,左圖為品牌原定活動主題已經陳設在阪急看板,右圖為滾動調整後,與民眾一起祈禱疫情快過。/Photo Credit: 新聞資料

此外,在社群平台上也可以看到大家紛紛利用自媒體的流量,即時同步政府訊息,分享疫情指揮中心最新的防疫措施,如立法委員蔣萬安、江啟臣、孫大千、洪孟楷等人,除了盡政治人物職責在臉書提供民眾第一手疫情政策措施及防疫相關資訊外,也發揮社群影響力進行串聯,呼籲大家在家別亂跑。電商平台也在臉書社群提供民眾最新的疫情發展,並針對疫區民眾主動發送安心簡訊,並以 email 通知到貨時間,讓民眾知道商品供應無虞,不必恐慌搶購物資。

透過社群影響力,可有效提醒民眾居家防疫及快速傳遞資訊。/Photo Credit: 新聞資料

跟隨政府動態提供「階段式購物」,買得到之餘也要安全送達

隨著政府公告,因應疫情不斷升級,許多行業也進行了階段式的調整。如多家餐廳先推出外帶折扣或在戶外推出外帶專區,第二階段則是推出便當或套餐組合搶攻外帶市場,再來則是加入外送行列,甚至是推出宅配料理包,讓民眾不出門也能享受美味,配合消費者需求提供階段式服務。

電商也洞察消費者需求,優先提供民眾防護用品,如口罩、酒精等清潔消毒用品;第二階段則是生活必需品,如泡麵、衛生紙、即食料理等;第三階段是當居家辦公、分流措施啟動後所需要的辦公用品及筆電等,尤其是開始停課之後,小孩居家學習也不能中斷,因此線上學習的用品也不能少;而隨著休閒育樂場所的關閉,第四階段推出運動健身用品鼓勵大家在家運動;第五階段則是因應部分地區開始停班停課,也推出在家娛樂用品,解決民眾因長期居家而產生的憂鬱感。

許多餐廳因應疫情,進行階段式調整。/Photo Credit: 新聞資料
電商也規劃階段式購物以滿足消費者所需。/Photo Credit: 新聞資料

疫情期間為遵守防疫政策,民眾開始減少外出,生活物資採購需求迅速轉為線上購買,大量民生用品採購紛紛改用電商及美食平台一次滿足,外送平台也因此積極找尋更多合作夥伴,如台鐵便當、IKEA 等。過往只有實體販賣的品牌都開始與外送平台合作,讓消費者一站購足;甚至連計程車業台灣大車隊也開始轉型投入餐飲外送行列;許多餐飲大品牌也加速數位化,如王品、饗食天堂;百貨也因禁止內用改為外帶外送,如全台遠百在一樓戶外設立「速立便」供消費者外帶及取貨,及線上「Stay Home」商品專區,業績也因此有顯著成長。而電商及外送平台作為防疫時期生活物資的後盾,也採取對應安全應變措施,像 PChome 24h購物除落實無接觸防疫政策外,也為員工增加購買「防疫保險」,費用由公司全額負擔,保障員工也保障消費者安全;無獨有偶,美食外送平台也呼籲消費者使用刷卡取代付現,為的都是確保在至關重要的最後一哩路上,給予消費者全方位、安全無虞的防疫保障。

外送、物流業者送貨不上樓,最後一哩路保障員工及消費者的安全。/Photo Credit: 新聞資料

疫情加速全台數位化轉型 齊心度過艱難時刻! 

因應全台停課,教育部主動開啟許多線上資源,提供數位雲端化的線上課程及線上作業,讓學生停課不停學,在家也能線上學習。一直以來推行在線遊戲學習平台的 PaGameO 也與慈濟合作推行防疫線上學習,利用線上電競遊戲的概念進行環保教育,打造環境教育與防疫意識,趁著疫情推廣數位化學習。許多健身房及私人教練也推出線上訓練課程,鼓勵在家的民眾更多運動的選擇,幫助提升免疫力,還能講降低情緒低落感。

攤開確診者足跡一看,傳統市場、生鮮超市都成為群聚熱點,擁有生鮮供貨的電商平台在疫情期間成為至關重要的防疫主力,透過線上購物可以減少人際接觸,安心防疫準備日常生活物資。實體超市也開始與外送平台合作推出生鮮專區,降低群聚採買風險。另一方面,各縣市鄉鎮的農會也在此時推出蔬菜箱、漁產箱、肉品箱等生鮮宅配,讓大家可以安心在家逛市場,透過線上網購滿足,台灣規模最大的農產運銷公司北農也推出各種蔬菜箱,滿足不同需求的家庭和消費者。

業者推出蔬菜箱,透過線上訂購滿足民眾需求。圖片來源:/Photo Credit:新聞資料

去年因為台灣防疫有成,大家都在擔心是否錯過了全球數位化轉型的浪潮,但是在這次疫情升溫的險峻時刻,我們也看到台灣在數位化、線上化帶來很大的改變,人民能夠維持日常生活,各行各業都扮演著至關重要的角色,相信在需要更多正能量的此時,我們能夠持續給予彼此協助、堅持下去。

本文章內容由「戰國策傳播集團」提供,經關鍵評論網媒體集團廣編企劃編審。