變數的命名 (for Variables)
- 使用 camelCase 為變數命名
// bad
var dogname = 'Droopy';
// bad
var dog_name = 'Droopy';
// bad
var DOGNAME = 'Droopy';
// bad
var DOG_NAME = 'Droopy';
// good
var dogName = 'Droopy';
- 明確表明意義的命名 (self-explanatory and describe the stored value)
// bad
var d = 'Scooby-Doo';
// bad
var name = 'Scooby-Doo';
// good
var dogName = 'Scooby-Doo';
布林值的命名 (for Booleans)
使用開頭為 is/has 的命名 (Use is or has as prefixes)
// bad
var bark = false;
// good
var isBark = false;
// bad
var ideal = true;
// good
var areIdeal = true;
// bad
var owner = true;
// good
var hasOwner = true;
函式的命名(for Functions)
- 使用 camelCase 為函式命名
- 使用動詞作為前綴
- 如果有特定意義或範圍,使用描述性的名詞作為前綴
Use descriptive nouns and verbs as prefixes.
// bad
function dogName(dogName, ownerName) {
return `${dogName} ${ownerName}`;
}
// good
function getDogName(dogName, ownerName) {
return `${dogName} ${ownerName}`;
}
常數的命名(for Constants)
- 使用 UPPERCASE 為常數命名(表示它們是不變的變數)
var SPEED = 1;
- 如果常數宣告名稱包含多個單字,則應使用 UPPER_SNAKE_CASE。
var DAYS_UNTIL_TOMORROW = 1;
類別的命名(for Classes)
使用 PascalCase 為類別命名
class Dog {
constructor() {}
}
方法的命名(for Methods)
使用 camelCase 為元件命名
class Dog {
constructor() {}
pickUpBall() {}
}
私有函式/私有變數的命名(for Private Functions/Variables in Classes)
Use a hash # prefix.
class ClassWithPrivate {
#privateField;
#privateFieldWithInitializer = 42;
#privateMethod() {
// …
}
static #privateStaticField;
static #privateStaticFieldWithInitializer = 42;
static #privateStaticMethod() {
// …
}
}
元件的命名(for Components)
使用 PascalCase 為元件命名
function Dog(){
return <div></div>
}
全域變數的命名 (for Global Variables)
如果變數在所有地方都可以存取它,則它被定義為全域變數 全域 JavaScript 變數沒有特殊的命名約定,但仍可以嘗試遵守下列原則:
- 全域 JavaScript 變數在專案/文件的頂部聲明
- 如果全域 JavaScript 變數是可變的,則以 camelCase 命名
- 如果全域 JavaScript 變數是不可變的,則用 UPPERCASE 命名
錯誤情境需要有效管理
- add unhandledrejection event to capture unhandled promise
- fill all reject message for useful tracing
function createScript(src) {
return new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = src
script.onload = () => {
resolve()
}
script.onerror = () => {
reject(new Error('load script error'))
}
})
}
使用 promise 時,一定要記得 catch,否則 sentry 上會收到 unhandled promise rejection
// ❌
function loadScript() {
return createScript('https://xxx/axios.min.js')
.then(() => {
console.log('axios loaded')
})
}
// ❌
async function loadScript() {
await createScript('https://xxx/axios.min.js')
console.log('axios loaded')
}
// ✅
function loadScript() {
return createScript('https://xxx/axios.min.js')
.then(() => {
console.log('axios loaded')
})
.catch((error) => {
console.error(error)
})
}
// ✅
async function loadScript() {
try {
await createScript('https://xxx/axios.min.js')
console.log('axios loaded')
} catch (error) {
console.error(error)
}
}
reject 一定要帶值,否則 sentry 上會收到 undefined promise rejection
// ❌
reject()
// ✅
reject(new Error('error message'))
// ✅
reject('error message')