?
英文 | https://blog.stackademic.com/as-a-front-end-engineer-10-javascript-tricks-and-tips-you-should-know-about-96bc46b5c6be
前言
過去我寫了很多垃圾代碼,現(xiàn)在看起來很糟糕。當(dāng)我再次看到那些代碼片段時(shí),我什至懷疑自己是否適合做一名程序員。
因此,今天我想跟你分享 10 個(gè)關(guān)于 JavaScript的小技巧,希望可以幫助你避免編寫我曾經(jīng)寫過的垃圾代碼。
1.Promise回調(diào)地獄
Promise 提供了一種優(yōu)雅的方式來處理 JavaScript 中的異步操作。這也是避免“回調(diào)地獄”的解決方案之一。但我不太明白這是什么意思,所以我寫了這段代碼。
我做了這些事情:
首先獲取用戶的基本信息。
按用戶信息獲取所有文章的簡要摘要。
通過文章簡要了解文章詳情。
// ?
getUserInfo()
.then((userInfo) => {
getArticles(userInfo)
.then((articles) => {
Promise.all(articles.map((article) => getArticleDetail(article)))
.then((articleDetails) => {
console.log(articleDetails)
})
})
})
我在這里根本沒有利用 Promise。我們應(yīng)該像下面的代碼片段一樣處理它:
// ?
getUserInfo()
.then((getArticles)
.then((articles) => {
return Promise.all(articles.map((article) => getArticleDetail(article)))
})
.then((articleDetails) => {
console.log(articleDetails)
})
2. 不處理錯(cuò)誤消息
我經(jīng)常只寫請(qǐng)求成功的代碼邏輯,而忽略請(qǐng)求失敗的代碼邏輯。
// ?
const getUserInfo = async () => {
try {
const userInfo = await fetch('/api/getUserInfo')
} catch (err) {
}
}
這是缺乏經(jīng)驗(yàn)的做法,我們應(yīng)該給出一個(gè)用戶友好的提示,而不是什么也不做。
// ?
const getUserInfo = async () => {
try {
const userInfo = await fetch('/api/getUserInfo')
} catch (err) {
Toast(err.message)
}
}
3.為函數(shù)設(shè)置太多參數(shù)。
當(dāng)一個(gè)函數(shù)的參數(shù)太多時(shí),它的可讀性就會(huì)降低,甚至讓我們不知道如何正確地傳遞參數(shù)。
舉個(gè)例子:
我們想要獲取用戶的一些基本信息,比如姓名、性別、年齡等。
// ?
const getUserInfo = (name, age, weight, gender, mobile , nationality, hobby, address) => {
// ...
}
getUserInfo('fatfish', 100, 2000, ...)
那太糟了。如果你的同事寫出這樣的代碼,你會(huì)毆打他嗎?
事實(shí)上,當(dāng)函數(shù)參數(shù)過多時(shí),應(yīng)該使用對(duì)象來傳遞所需的信息,這樣其可讀性和可擴(kuò)展性就會(huì)提高。
// ?
const getUserInfo = (options) => {
const { name, gender, age, mobile, weight, nationality, hobby, address } = options
// ...
}
getUserInfo({
name: 'fatfish',
age: 100,
weight: 2000
// ...
})
4.使用幻數(shù)
小伙伴們,你們有寫過這樣的代碼嗎?很多地方用數(shù)字來進(jìn)行邏輯判斷似乎很正常。是的,這讓我很困惑 1、2、3 到底是什么意思。
?
// component1.js
if (status === 1 || status === 2) {
// ...
} else if (status === 3) {
// ...
}
// component2.js
if (status === 1 || status === 2) {
// ...
}
我們最好將這些數(shù)字定義為常量。
// ?
// constants.js
export const STATUS = {
// It is an adult and has real-name authentication
adultRealName: 1,
// It is a minor and has real-name authentication
minorRealName: 2,
// Not real-name authentication
notRealName: 3,
// ...
}
// component1.js
import { STATUS } from './constants.js'
if ([ STATUS.adultRealName, STATUS.minorRealName ].includes(status)) {
// ...
} else if (status === STATUS.notRealName) {
// ...
}
// component2.js
import { STATUS } from './constants.js'
// component2.js
if ([ STATUS.adultRealName, STATUS.minorRealName ].includes(status)) {
// ...
}
5.使用.length判斷字符串的長度
大多數(shù)時(shí)候,我們使用.length,判斷字符串的長度是安全的,但是在表單輸入的情況下要小心使用。
當(dāng)我們輸入 ?? 時(shí),nameLen 的值為 2 — 這不是很奇怪嗎?
// ?
<input type="text" id="name">
<script>
const $name = document.getElementById('name')
$name.addEventListener('blur', () => {
const name = $name.value
const nameLen = name.length
// input: fatfish => nameLen: 7
// input: ?? => nameLen: 2
console.log(`name: ${name}, nameLen: ${nameLen}`)
}, false)
</script>
是的,這是有原因的,你猜怎么著?
// ?
<input type="text" id="name">
<script>
const $name = document.getElementById('name')
$name.addEventListener('blur', () => {
const name = $name.value
const nameLen = name.length
const spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g
const nameRealLen = name.replace(spRegexp, '_').length
// input: fatfish => nameLen: 7, nameRealLen: 7
// input: ?? => nameLen: 2, nameRealLen: 1
console.log(`name: ${name}, nameLen: ${nameLen}, nameRealLen: ${nameRealLen}`)
}, false)
</script>
6.永遠(yuǎn)不要寫代碼注釋
我們經(jīng)常向別人抱怨:“你為什么不寫代碼注釋呢?” 但實(shí)際上,我從來沒有寫過!
// ?
const fn = (dpr) => {
if (dpr >= 2) {
// ...
} else {
}
}
天哪,你知道“dpr”是什么意思嗎?我沒想到這意味著窗口設(shè)備PixelRatio。
// ?
// dpr: Please enter a value for window.devicePixelRatio
const fn = (dpr) => {
if (dpr >= 2) {
// ...
} else {
}
}
7. 無意義的代碼注釋
與其寫無意義的代碼注釋,還不如不寫代碼注釋,因?yàn)樗速M(fèi)你的時(shí)間。
你不妨解釋一下“a”的含義或使用有意義的變量名稱!
// ?
let a = 1 // Set the value of "a" to 1
8. 隨機(jī)命名
過去,我常常編寫隨機(jī)命名變量的尷尬代碼片段。
朋友們,請(qǐng)不要向我學(xué)習(xí)。你應(yīng)該給變量一個(gè)正確且有意義的名稱。
9. 不刪除已棄用的代碼
很多時(shí)候,我們的網(wǎng)站會(huì)不斷調(diào)整功能,有新的和廢棄的功能,但我總是擔(dān)心以后會(huì)用到它們,所以我只是注釋它們,而不是刪除它們。
其實(shí)這種擔(dān)心完全沒有必要,因?yàn)橐院笥玫目赡苄院苄?。即使以后要用到,也可以通過‘git’進(jìn)行追溯。
10. 一千多行組件代碼
我在一個(gè)組件中編寫了一千多行代碼。這太糟糕了,我們應(yīng)該將組件的功能進(jìn)一步拆分為更小的組件。
最后
以上就是我今天想與你分享的全部內(nèi)容,希望對(duì)你有用。
該文章在 2024/10/14 10:16:11 編輯過