這裡我會掌握幾個大的重點前進。
fetchData
,我會覺得這很抽象,我會改叫fetchProductData
。NotificationModal
。// One True Brace Style
function foo(x, y, y) {
....
}
// 不推薦
var obj = new Object();
var arr = new Array();
var str = new String();
var num = new Number();
var bool = new Boolean();
// 推薦
var obj = {};
var arr = [];
var str = String();
var num = Number();
var bool = Boolean();
// 三元運算式的不好範例
return x === 0 ? 'red' : x === 1 ? 'green' : 'blue';
// 比較推薦
if (x === 0) {
return 'red';
} else if (x === 1) {
return 'green';
} else {
return 'blue';
}
// 最推薦
switch (x) {
case 0:
return 'red';
case 1:
return 'green';
default:
return 'blue';
}
// 這是 React 的 Component
export const ModeIcon = ({ cell }) => {
switch (cell) {
case 'AIR':
return <div className='text-info'><i className='fas fa-plane' /></div>
case 'SEA':
return <div className='text-info'><i className='fas fa-ship' /></div>
case 'RAIL':
return <div className='text-info'><i className='fas fa-train' /></div>
case 'TRUCK':
return <div className='text-info'><i className='fas fa-truck' /></div>
default:
return { cell }
}
}
ModeIcon.propTypes = {
cell: PropTypes.string.isRequired,
}
// 不好
foo && bar()
if (foo) {bar()}
foo || bar()
if (!foo) {bar()}
// 不安全也不好閱讀
return ++foo
// 推薦
++foo
return foo
if (x === undefined) {x = 0}
// 好的做法
var obj = {
first: 'Jane',
last: 'Doe',
}
// I18n 翻譯檔
const MilestoneEdiStatusQuery = {
required: 'Required',
query: {
clientIdList: 'Customer Code',
ediMappingStatusList: 'EDI Status',
masterNumberList: 'MAWB / MBL',
hawbNumberList: 'HAWB / HBL',
deliveryNumberList: 'DN / SID',
hawbOriginPortList: 'Orig',
hawbDestinationPortList: 'Dest',
ediRequestedStartOn: 'EDI Req. Date',
ediRequestedEndOn: ' ',
ediSentStartOn: 'EDI Sent Date',
ediSentEndOn: ' ',
shipmentModeList: 'Mode',
milestoneStatusList: 'Milestone Status',
},
}
export default MilestoneEdiStatusQuery
var result = foo(1, 2) // 左括弧之後跟右括弧之前不會有空白
var arr = [1, 2, 3] // 逗號後面會空一格
const foo = function (x) {...} // 匿名 function,會在關鍵字 function 後面空格
見人見智,像是我就非常不喜歡。
return x === 0 ? 'red' : 'blue'; // 不建議
return (x === 0 ? 'red' : 'blue'); // 好的做法
// 不建議
var foo = 3,
bar = 2,
baz;
// 好的做法
var foo = 3;
var bar = 2;
var baz;
// 不建議
if (v) {
var x = v;
} else {
var x = 10;
}
// 好的做法
var x;
if (v) {
x = v;
} else {
x = 10;
}
Coercion (強制轉型) 可分為兩種,分別是「明確的」強制轉型 (explicit coercion) 和「隱含的」強制轉型 (implicit coercion),只要是程式碼中刻意寫出來的型別轉換的動作,就是明確的強制轉型;反之,在程式碼中沒有明確指出要轉換型別卻轉型的,就是隱含的強制轉型。
'3' * '4' // 12, number
Number('3' * '4') // 12
時空背景:不管是寫 JavaScript 的原生、Vue、React or Angular 也好。
編輯器:以 Visual Stadio Code (VSCode) 為舉例。
套件:會使用 ESLint、Prettier 來協助開發。
目的:確保整個團隊開發的風格一致。
ESLint 是一個 Javascript Linter,他能確保你的程式碼品質在一定的水準之上,是我自己寫 JS 時一定會使用的工具之一,在團隊內也很建議使用他以確保被提交上去的程式碼品質。
Linter 會幫你做靜態語法分析,在你執行之前抓出可能的錯誤,大部分的 Linter 會有以下幾個功能:
===
而非 ==
、不使用 eval
…。import
了沒有使用的模組、空的 class constructor …。目前比較熱門的 style guide 有 Google、Airbnb 跟 Standard 三個,使用 style guide 的好處就是不用自己設定規則,但彈性稍低。