摘要:首次發(fā)表在個(gè)人博客前言程序語(yǔ)言的編碼風(fēng)格指南對(duì)于一個(gè)長(zhǎng)期維護(hù)的軟件而言是非常重要的好的編程風(fēng)格有助于寫出質(zhì)量更高錯(cuò)誤更少更易于維護(hù)的程序。
首次發(fā)表在個(gè)人博客前言
程序語(yǔ)言的編碼風(fēng)格指南對(duì)于一個(gè)長(zhǎng)期維護(hù)的軟件而言是非常重要的;好的編程風(fēng)格有助于寫出質(zhì)量更高、錯(cuò)誤更少、更易于 維護(hù)的程序。
團(tuán)隊(duì)合作需要制定一些代碼規(guī)范還有利用一些工具來(lái)強(qiáng)制要求團(tuán)隊(duì)代碼的風(fēng)格統(tǒng)一.畢竟很多情況下以后不一定是由寫一手代碼的人來(lái)維護(hù)代碼,所以有一個(gè)統(tǒng)一的代碼風(fēng)格很重要!!!
最近看了一下編寫可維護(hù)的JavaScript和編寫高質(zhì)量代碼:Web前端開發(fā)修煉之道,根據(jù)書中提倡的一些寫法,同時(shí)結(jié)合我個(gè)人的經(jīng)驗(yàn)和喜好做了一些改動(dòng),大致整理了如下JavaScript編碼風(fēng)格
JavaScript編碼風(fēng)格 1.縮進(jìn)每一行的層級(jí)由4個(gè)空格組成,避免使用制表符(Tab)進(jìn)行縮進(jìn)
if (true) { doSomething(); }2.行的長(zhǎng)度
每行長(zhǎng)度不應(yīng)該超過(guò)80個(gè)字符.如果一行多于80個(gè)字符,應(yīng)當(dāng)在一個(gè)運(yùn)算符(逗號(hào),加好等)后換行.下一級(jí)應(yīng)當(dāng)增加兩級(jí)縮進(jìn)(8個(gè)字符).
// 好的寫法 doSomething(arg1, arg2, arg3, arg4, arg5); // 不好的寫法: 第二行只有4個(gè)空格的縮進(jìn) doSomething(arg1, arg2, arg3, arg4, arg5); // 不好的寫法: 在運(yùn)算符之前換行 doSomething(arg1, arg2, arg3, arg4 ,arg5);3.原始值
特殊值null除了下述情況應(yīng)當(dāng)避免使用
用來(lái)初始化一個(gè)變量,這個(gè)變量可能被賦值為一個(gè)對(duì)象
用來(lái)和一個(gè)已經(jīng)初始化的變量比較,這個(gè)變量可以是也可以不是一個(gè)對(duì)象
當(dāng)函數(shù)的參數(shù)期望是對(duì)象時(shí),被用作返回值傳出
// 好的做法 const person = null;
判斷一個(gè)變量是否定義應(yīng)當(dāng)使用 typeof 操作符
// 好的寫法 if (typeof constiable == "undefined") { // do something } // 不好的寫法 if (constiable == "undefined") { // do something }4.運(yùn)算符間距
二元運(yùn)算符前后必須使用一個(gè)空格來(lái)保持表達(dá)式的整潔.操作符包括賦值運(yùn)算符和邏輯運(yùn)算符
// 好的寫法 const found = (values[i] === item); // 不好的寫法: 丟失了空格 const found = (values[i]===item); // 好的寫法 if (found && (count > 10)) { doSomething(); } // 不好的寫法: 丟失了空格 if (found&&(count>10)) { doSomething(); } // 好的寫法 for(let i = 0; i < count; i++) { process(i); } // 不好的寫法: 丟失了空格 for(let i=0; i5.括號(hào)間距 當(dāng)使用括號(hào)時(shí),緊接左括號(hào)之后和緊接右括號(hào)之前不應(yīng)該有空格
// 好的寫法 const found = (values[i] === item); // 不好的寫法: 左括號(hào)之后有額外的空格 const found = ( values[i] === item); // 好的寫法 if (found && (count > 10)) { doSomething(); } // 不好的寫法: 右括號(hào)之后有額外的空格 if (found && (count > 10) ) { doSomething(); } // 好的寫法 for(let i = 0; i < count; i++) { process(i); } // 不好的寫法: 參數(shù)兩邊有額外的空格 for(let i = 0; i< count; i++) { process( i ); }6.對(duì)象直接量對(duì)象直接量應(yīng)當(dāng)使用如下格式
起始左花括號(hào)應(yīng)當(dāng)同表達(dá)式保持同一行
每個(gè)屬性的名值對(duì)應(yīng)當(dāng)保持一個(gè)縮進(jìn),第一個(gè)屬性應(yīng)當(dāng)在左花括號(hào)后另起一行.
每個(gè)屬性的名值對(duì)應(yīng)當(dāng)使用不含引號(hào)的屬性名,其后緊跟一個(gè)冒號(hào)(之前不含空格),而后是值
倘若屬性值是函數(shù)類型,函數(shù)體應(yīng)當(dāng)在屬性名之下另起一行,而且其前后均應(yīng)保留一個(gè)空行
一組相關(guān)的屬性前后可以插入空行以提高代碼的可讀性
結(jié)束的右花括號(hào)應(yīng)當(dāng)獨(dú)占一行
// 好的寫法 const object = { key1: value1, key2: value2, func: function() { }, key3: value3, }; // 不好的寫法: 不恰當(dāng)?shù)目s進(jìn) const object = { key1: value1, key2: value2, }; // 不好的寫法:函數(shù)體缺少空行 const object = { key1: value1, key2: value2, func: function() { }, key3: value3, };當(dāng)對(duì)象字面量作為函數(shù)參數(shù)時(shí),如果值是變量,起始花括號(hào)應(yīng)當(dāng)同函數(shù)名在同一行.所有其余先前列出的規(guī)則同樣適用
// 好的寫法 doSomething({ key1: value1, key2: value2, }); // 不好的寫法 doSomething({ key1: value1, key2: value2 });7.注釋頻繁地適用注釋有助于他人理解你的代碼.如下情況應(yīng)當(dāng)使用注釋
代碼晦澀難懂
可能被誤認(rèn)為錯(cuò)誤的代碼
必要但不明顯的針對(duì)特定瀏覽器的代碼
對(duì)于對(duì)象,方法或者屬性,生成文檔是有必要的(使用恰當(dāng)?shù)奈臋n注釋).
1).單行注釋使用單行注釋當(dāng)用來(lái)說(shuō)明一行代碼或者一組代碼.單行注釋可能有三種使用方式
獨(dú)占一行的注釋,用來(lái)解釋下一行代碼
在代碼行的尾部的注釋,用來(lái)解釋它之前的代碼
多行,用來(lái)注釋掉一個(gè)代碼塊
// 好的寫法 if (condition) { // 如果代碼執(zhí)行到這里,則說(shuō)明通過(guò)了所有的安全性檢測(cè) allowed(); } // 不好的寫法:注釋之前沒(méi)有空行 if (condition) { // 如果代碼執(zhí)行到這里,則說(shuō)明通過(guò)了所有的安全性檢測(cè) allowed(); } // 不好的寫法: 錯(cuò)誤的縮進(jìn) if (condition) { // 如果代碼執(zhí)行到這里,則說(shuō)明通過(guò)了所有的安全性檢測(cè) allowed(); } // 不好的寫法: 這里應(yīng)當(dāng)用多行注釋 // 接下來(lái)的這段代碼非常難, 那么,讓我詳細(xì)的解釋一下 // 1. xxxx // 2. xxxx if (condition) { // 如果代碼執(zhí)行到這里,則說(shuō)明通過(guò)了所有的安全性檢測(cè) allowed(); }對(duì)于代碼行尾單行注釋的情況,應(yīng)確保代碼結(jié)尾同注釋之間至少一個(gè)縮進(jìn)
// 好的寫法 const result = something + somethingElse; // somethingElse will never be null // 不好的寫法: 代碼和注釋間沒(méi)有足夠的空格 const result = something + somethingElse;// somethingElse will never be null注釋一個(gè)代碼塊時(shí)在連續(xù)多行使用單行注釋是唯一可以接受的情況.多行注釋不應(yīng)當(dāng)在這種情況下使用
// 好的寫法 // if(condition) { // doSomething(); // }2).多行注釋多行注釋應(yīng)當(dāng)在代碼需要更多文字去解釋的時(shí)候使用.每個(gè)多行注釋都至少有如下三行.
1.首行僅僅包括 /* 注釋開始.該行不應(yīng)當(dāng)有其他文字
2.接下來(lái)的行以 * 開頭并保持左對(duì)齊.這些行可以由文字描述
3.最后一行以 */開頭并同先前行保持對(duì)齊.也不應(yīng)當(dāng)有其他文字多行注釋的首行應(yīng)當(dāng)保持同它描述代碼的相同層次的縮進(jìn).后續(xù)的每行應(yīng)當(dāng)有同樣層次的縮進(jìn)并附加一個(gè)空格(為了適當(dāng)保持 * 字符的對(duì)齊).每一個(gè)多行代碼之前應(yīng)當(dāng)預(yù)留一個(gè)空格
// 好的寫法 if (condition) { /* * 如果代碼執(zhí)行到這里 * 說(shuō)明通過(guò)了所有的安全性檢測(cè) */ allowed(); } // 不好的寫法: 注釋之前無(wú)空行 if (condition) { /* * 如果代碼執(zhí)行到這里 * 說(shuō)明通過(guò)了所有的安全性檢測(cè) */ allowed(); } // 不好的寫法: 星號(hào)后沒(méi)有空格 if (condition) { /* *如果代碼執(zhí)行到這里 *說(shuō)明通過(guò)了所有的安全性檢測(cè) */ allowed(); } // 不好的寫法: 錯(cuò)誤的縮進(jìn) if (condition) { /* * 如果代碼執(zhí)行到這里 * 說(shuō)明通過(guò)了所有的安全性檢測(cè) */ allowed(); } // 不好的寫法: 代碼尾部注釋不要用多行注釋格式 const result = something + somethingElse; /* somethingElse 不應(yīng)當(dāng)取值為null */3)注釋聲明注釋有時(shí)候可以用來(lái)給一段代碼聲明額外的信息.這些聲明的格式以單個(gè)單詞打頭并緊跟一個(gè)雙引號(hào).可使用的聲明如下
TODO: 說(shuō)明代碼還未完成.應(yīng)當(dāng)包含下一步要做的事情
HACK: 表明代碼實(shí)現(xiàn)走了一個(gè)捷徑
XXX: 說(shuō)明代碼是有問(wèn)題的并應(yīng)當(dāng)盡快修復(fù)
FIXME: 說(shuō)明代碼是有問(wèn)題的并應(yīng)當(dāng)盡快修復(fù).重要性略次于XXX
REVIEW: 說(shuō)明代碼任何可能的改動(dòng)都需要評(píng)審
這些聲明可能在一行或多行注釋中使用,并且應(yīng)當(dāng)遵循同一般注釋類型相同的格式規(guī)則
// 好的寫法 // TODO: 我希望找到一種更快的方式 doSomething(); // 不好的寫法: 注釋聲明空格不正確 // TODO : 我希望找到一種更快的方式 doSomething(); // 好的寫法 // REVIEW: 有更好的方法嗎? doSomething(); // 不好的寫法: 代碼和注釋應(yīng)當(dāng)保持同樣的縮進(jìn) // REVIEW: 有更好的方法嗎? doSomething();8.命名變量命名應(yīng)當(dāng)采用駝峰命名格式,首字母小寫,每個(gè)單詞首字母大寫.變量名的第一個(gè)單詞應(yīng)當(dāng)是一個(gè)名詞(而非動(dòng)詞)比避免同函數(shù)混淆.不要在變量名中使用下劃線
// 好的寫法 const myName = "Jack"; // 不好的寫法: 大寫字母開頭 const MyName = "Jack"; // 不好的寫法: 動(dòng)詞開頭 const getMyName = "Jack"; // 不好的寫法: 使用下劃線 const my_name = "Jack";函數(shù)命名應(yīng)當(dāng)采用駝峰命名格式.函數(shù)名的第一個(gè)單詞應(yīng)當(dāng)是動(dòng)詞(而非名詞)來(lái)避免同變量混淆.函數(shù)名中最好不要使用下劃線.
// 好的寫法 function doSomething() { // 代碼 } // 不好的寫法: 大寫字母開頭 function DoSomething() { // 代碼 } // 不好的寫法: 名詞開頭 function car() { // 代碼 } // 不好的寫法: 使用下劃線 function do_something() { // 代碼 }構(gòu)造函數(shù)--通過(guò)new元素安撫創(chuàng)建新對(duì)象的函數(shù)--也應(yīng)使用駝峰合適命名,首先首字母大寫.構(gòu)造函數(shù)命名應(yīng)當(dāng)以非動(dòng)詞開頭,因?yàn)閚ew代表著創(chuàng)建一個(gè)對(duì)象實(shí)例的操作
// 好的寫法 function MyObject() { } // 不好的寫法: 小寫字母開頭 function myObject() { } // 不好的寫法: 使用下劃線 function My_Object() { } // 不好的寫法: 動(dòng)詞開頭 function getMyObject() { }常量(不會(huì)被改變的變量)的命名應(yīng)當(dāng)是所有字母大寫,不同單詞之間用單個(gè)下劃線隔開.ES6中使用const來(lái)聲明一個(gè)常量
// 好的寫法 const TOTAL_COUNT = 10; // 不好的寫法 const totalCount = 10; // 不好的寫法: 混合模式 const total_COUNT = 10;對(duì)象的屬性同變量的命名規(guī)范相同.對(duì)象的方法同函數(shù)的命名規(guī)則相同.如果屬性或者方法是私有的,應(yīng)當(dāng)在之前加一個(gè)下劃線
// 好的寫法 const object = { _count: 10, _getCount: function() { return this._count; } }9.賦值當(dāng)給變量賦值時(shí),如果右側(cè)是含有比較語(yǔ)句的表達(dá)式,需要用圓括號(hào)包裹
// 好的寫法 const flag = (i < count); // 不好的寫法:遺漏圓括號(hào) const flag = i < count;10.等號(hào)運(yùn)算符使用 === (嚴(yán)格相等) 和 !==(嚴(yán)格不相等)代替 ==(相等) 和 !=(不等) 來(lái)避免弱類型轉(zhuǎn)換錯(cuò)誤
// 好的寫法 const same = (a === b); // 不好的寫法: 使用 == const same = (a == b);11.三元操作符三元運(yùn)算符應(yīng)當(dāng)僅僅用在條件賦值語(yǔ)句中,而不要作為if語(yǔ)句的替代品.
// 好的寫法 const value = condition ? value1 : value2; // 不好的寫法: 沒(méi)有賦值,應(yīng)當(dāng)使用 if 表達(dá)式 condition ? doSomething() : doSomethingElse();12.語(yǔ)句 簡(jiǎn)單語(yǔ)句每一行最多只包含一條語(yǔ)句.所有簡(jiǎn)單的語(yǔ)句都應(yīng)該以分號(hào)(;)結(jié)束.
// 好的寫法 const a = 1; const b = 2; const c = a + b; // 不好的寫法: 多個(gè)表達(dá)式寫在一行 const a = 1;const b = 2;const c = a + b;返回語(yǔ)句返回語(yǔ)句當(dāng)返回一個(gè)值的時(shí)候不應(yīng)當(dāng)使用圓括號(hào)包裹,除非在某些情況下這么做可以讓返回值更容易理解.例如:
return; return collection.size(); return (size > 0 ? size : defaultSize)復(fù)合語(yǔ)句復(fù)合語(yǔ)句是大括號(hào)括起來(lái)的語(yǔ)句列表;
括起來(lái)的語(yǔ)句應(yīng)當(dāng)較復(fù)合語(yǔ)句多縮進(jìn)一個(gè)層級(jí)
開始的大括號(hào)應(yīng)當(dāng)在復(fù)合語(yǔ)句所在行的末尾;結(jié)束的大括號(hào)應(yīng)當(dāng)獨(dú)占一行且同復(fù)合語(yǔ)句的開始保持同樣的縮進(jìn).
當(dāng)括號(hào)時(shí)控制結(jié)構(gòu)的一部分時(shí),諸如if或者for語(yǔ)句,所有語(yǔ)句都需要用打括號(hào)括起來(lái),也包括單個(gè)語(yǔ)句.這個(gè)約定使得我們更方便地添加語(yǔ)句而不用擔(dān)心忘記加括號(hào)而引起bug
像if一樣的語(yǔ)句開始的關(guān)鍵詞,其后應(yīng)當(dāng)緊跟一個(gè)空格,起始大括號(hào)應(yīng)當(dāng)在空格之后
if語(yǔ)句if (condition) { statements } else if (condition) { statements } else { statements }絕不允許在if語(yǔ)句中省略花括號(hào)
// 好的寫法 if (condition) { doSomething(); } // 不好的寫法: 不恰當(dāng)?shù)目崭?if(condition){ doSomething(); } // 不好的寫法: 遺漏花括號(hào) if (condition) doSomething(); // 不好的寫法: 所有代碼寫在一行 if (condition) { doSomething(); } // 不好的寫法: 所有代碼寫在一行且沒(méi)有花括號(hào) if (condition) doSomething();for語(yǔ)句for (initialization; condition; update) { statements } for (constiable in object) { statements }當(dāng)使用 for-in 語(yǔ)句時(shí),記得使用 hasOwnProperty() 進(jìn)行雙重檢查來(lái)過(guò)濾出對(duì)象的成員
while語(yǔ)句while (condition) { statements }do語(yǔ)句do { statements } while (condition)switch語(yǔ)句switch (expression) { case expression: statements default: statements }switch下的每一個(gè)case都叮當(dāng)保持一個(gè)縮進(jìn).除第一個(gè)之外包括default在內(nèi)的每一個(gè)case都應(yīng)當(dāng)在之前保持一個(gè)空行
每一組語(yǔ)句(除了default)都應(yīng)當(dāng)以break, return, throw結(jié)尾,或者用一行注釋表示跳過(guò)// 好的寫法 switch (value) { case 1: /* falls through */ case 2: doSomething(); break; case 3: return true; default: throw new Error("this should not happen"); }try語(yǔ)句try { statements } catch (constiable) { statements } finally { statements }13.嚴(yán)格模式嚴(yán)格模式應(yīng)當(dāng)僅限在函數(shù)內(nèi)部使用,千萬(wàn)不要在全局使用.
ES6 的模塊自動(dòng)采用嚴(yán)格模式,不管你有沒(méi)有在模塊頭部加上"use strict";。14.變量聲明所有的變量在使用前都應(yīng)事先定義.變量定義應(yīng)放在函數(shù)開頭.
變量定義前應(yīng)當(dāng)初始化,并且賦值操作符應(yīng)當(dāng)保持一致的縮進(jìn).初始化的變量應(yīng)當(dāng)在未初始化變量之前.推薦使用ES6的let和 const來(lái)聲明變量15.函數(shù)聲明函數(shù)聲明應(yīng)當(dāng)在使用前提前定義.
一個(gè)不是作為方法的函數(shù)(也就是沒(méi)有作為一個(gè)對(duì)象的屬性)應(yīng)當(dāng)使用函數(shù)定義的格式(不是函數(shù)表達(dá)式和Function構(gòu)造器格式).
函數(shù)名和開始圓括號(hào)之前不應(yīng)當(dāng)有空格.結(jié)束的圓括號(hào)和右邊的花括號(hào)之間應(yīng)該留一個(gè)空格.右側(cè)的花括號(hào)應(yīng)當(dāng)同function關(guān)鍵字保持同一行.開始和結(jié)束括號(hào)之間不應(yīng)該有空格.參數(shù)名之間應(yīng)當(dāng)在逗號(hào)之后保留一個(gè)空格.函數(shù)體應(yīng)當(dāng)保持一級(jí)縮進(jìn)// 好的寫法 function doSomething(arg1, agr2) { return arg1 + arg2; } // 不好的寫法: 第一行不恰當(dāng)?shù)目崭?function doSomething (arg1, agr2) { return arg1 + arg2; } // 不好的寫法: const doSomething = function doSomething(arg1, agr2) { return arg1 + arg2; } // 不好的寫法: 左側(cè)的花括號(hào)位置不對(duì) function doSomething(arg1, agr2) { return arg1 + arg2; } // 錯(cuò)誤的寫法: 使用Function構(gòu)造器 const doSomething = new Function("arg1", "agr2", "return arg1 + arg2");16.留白在邏輯相關(guān)的代碼塊之間添加空行可以提高代碼的可讀性
兩行空行權(quán)限在如下情況使用
在不同的源代碼文件之間
在類和接口定義之間
單行空行權(quán)限在如下情況使用
方法之間
方法中局部變量和第一行語(yǔ)句之間
多行或單行注釋之前
方法中邏輯代碼塊之間以提高代碼的可讀性
空格應(yīng)當(dāng)在如下情況中使用
關(guān)鍵詞后跟括號(hào)的情況應(yīng)當(dāng)用空格隔開
參數(shù)列表中逗號(hào)之后應(yīng)當(dāng)保留一個(gè)空格
所有的除了點(diǎn)(.)之外的二元運(yùn)算符,其操作數(shù)都應(yīng)當(dāng)用空格隔開.單目運(yùn)算符的操作數(shù)之間不應(yīng)該用空白隔開,諸如一元減號(hào),遞增(++),遞減(--)
for語(yǔ)句中的表達(dá)式之間應(yīng)當(dāng)用空格隔開
17. 需要避免的切勿使用像String一類的原始包裝類型創(chuàng)建的新對(duì)象
避免使用eval()
避免使用with語(yǔ)句.改語(yǔ)句在嚴(yán)格模式中不復(fù)存在,可能在未來(lái)也將去除
使用工具(eslint)來(lái)強(qiáng)制約束 eslint 規(guī)則eslint規(guī)則在.eslintrc.js中定義,覺(jué)得不合理的可以禁掉某條規(guī)則,或者有好的建議的也可以添加;
主要注意一下幾條:代碼縮進(jìn)用4空格
語(yǔ)句必須默認(rèn)后加分號(hào)
使用單引號(hào)
提交代碼前將console.log語(yǔ)句刪掉或注釋掉(不然影響其他開發(fā)人員調(diào)試)
禁止使用const,使用es6的let,const聲明變量
還有一些情況是不需要檢測(cè)的,例如第3方的庫(kù), 框架、組件、ui庫(kù)等等,可以將這些文件放在.eslintignore文件中,可以忽略eslint的檢測(cè)
在文件頂部加上下面這行,可以禁掉整個(gè)文件的eslint規(guī)則
/* eslint-disable */pre-commit代碼提交之前會(huì)強(qiáng)制code-review,不符合規(guī)范的不允許提交代碼
使用方法
1.在命令行安裝npm i --save-dev pre-commit2.在package.json中配置
{ "scripts": { "eslint": "eslint ./ --ext js,vue --ignore-pattern .eslintignore --cache --fix", "lint-message": "echo "開始 eslint 檢查, 存在 error 則會(huì)拒絕提交"" ? }, ? "pre-commit": [ "lint-message", "eslint" // 進(jìn)行eslint檢查并自動(dòng)修復(fù)一些簡(jiǎn)單的格式錯(cuò)誤 ? ], }代碼提交之前會(huì)強(qiáng)制code-review,不符合規(guī)范的不允許提交代碼
如果項(xiàng)目實(shí)在沒(méi)時(shí)間去改的話,可以 git commit -m "XXX" --no-verify 或 git commit -n "xxx" 強(qiáng)制提交
小技巧-vscode可以配置保存自動(dòng)修復(fù)eslint錯(cuò)誤vscode安裝eslint插件,在配置中配置如下
{ "eslint.autoFixOnSave": true, "eslint.enable": true, "eslint.options": { "extensions": [".js", ".vue", ".jsx"] }, "eslint.validate": [ { "language": "vue", "autoFix": true }, { "language": "javascript", "autoFix": true }, { "language": "javascriptreact", "autoFix": true } ], }配置完成之后,每次保存,都會(huì)自動(dòng)根據(jù) .eslintrc.js文件自動(dòng)修復(fù)空格,分號(hào)的錯(cuò)誤;但是最好還是在平常的編碼中養(yǎng)成一個(gè)良好的習(xí)慣,而不是依賴工具.下列參考給出的文章及書籍,有時(shí)間一定要好好看一下,會(huì)幫助大家深刻理解JavaScript編碼風(fēng)格的重要性。永遠(yuǎn)記住,規(guī)范能解決大部分問(wèn)題。
參考編寫可維護(hù)的JavaScript
編寫高質(zhì)量代碼:Web前端開發(fā)修煉之道
代碼整潔之道
ESLint
JavaScript編碼風(fēng)格
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95550.html
摘要:在這篇文章中,我描述了中常見的種不良編碼習(xí)慣。這是因?yàn)閷傩源嬖诘尿?yàn)證依賴于隱式轉(zhuǎn)換的布爾值。安裝使用最適合自己的編碼風(fēng)格配置設(shè)置一個(gè)預(yù)提交鉤子,在提交之前運(yùn)行驗(yàn)證。總結(jié)編寫高質(zhì)量和干凈的代碼需要紀(jì)律,克服不好的編碼習(xí)慣。 為了保證的可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 在閱讀JavaScript代碼時(shí),你是否有過(guò)這種感覺(jué) ...
摘要:在這篇文章中,我描述了中常見的種不良編碼習(xí)慣。這是因?yàn)閷傩源嬖诘尿?yàn)證依賴于隱式轉(zhuǎn)換的布爾值。安裝使用最適合自己的編碼風(fēng)格配置設(shè)置一個(gè)預(yù)提交鉤子,在提交之前運(yùn)行驗(yàn)證。總結(jié)編寫高質(zhì)量和干凈的代碼需要紀(jì)律,克服不好的編碼習(xí)慣。 為了保證的可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 在閱讀JavaScript代碼時(shí),你是否有過(guò)這種感覺(jué) ...
摘要:工具幫助避免在編寫時(shí)出現(xiàn)愚蠢的錯(cuò)誤。并不檢測(cè)潛在的,比如,未使用的變量或意外的全局變量等。在提到的所有工具中,它具有最廣泛的功能支持。使用工具是捕獲問(wèn)題的良好步驟,但只能看到規(guī)則允許的錯(cuò)誤。也可用于此目的。 Lint工具幫助避免在編寫JavaScript時(shí)出現(xiàn)愚蠢的錯(cuò)誤。盡管有多年的經(jīng)驗(yàn),我仍然鍵入不正確的變量名稱,出現(xiàn)語(yǔ)法錯(cuò)誤,以及忘記正確地處理error。在浪費(fèi)自己時(shí)間,或更糟糕地...
摘要:配置的參數(shù)打開根目錄下的在最后面加上如下的參數(shù)測(cè)試環(huán)境位內(nèi)存雙核測(cè)試版本經(jīng)測(cè)試,啟動(dòng)速度比默認(rèn)配置有所提升,占用內(nèi)存也較少其中這三行為啟用方式,不能保證在不同環(huán)境下都是最優(yōu)配置,可以替換為多核和大內(nèi)存建議使 配置eclipse的jvm參數(shù) 打開eclipse根目錄下的eclipse.ini在最后面加上如下的jvm參數(shù) -Xms400m -Xmx1400m -XX:NewSize=128...
閱讀 3745·2021-10-15 09:42
閱讀 2607·2021-09-03 10:50
閱讀 1654·2021-09-03 10:28
閱讀 1797·2019-08-30 15:54
閱讀 2520·2019-08-30 12:46
閱讀 415·2019-08-30 11:06
閱讀 2829·2019-08-30 10:54
閱讀 531·2019-08-29 12:59