十個提高前端JS代碼質量的小技巧

1抵碟、使用更嚴謹?shù)呐袛嗾Z句

Before:

function getData(val) {
  // val is 'A' or 'B'
  if (val === 'A') {
    // A code
  } else {
    // B code
  }
}

After:

即使val只有兩種可能性,也使用精確的判斷語句坏匪,未來值擴展時能保證相應的方法不受影響拟逮,也有助于提高可讀性

function getData(val) {
  // val is 'A' or 'B'
  if (val === 'A') {
    // A code
  } else if (val === 'B') {
    // B code
  }
}

2、讓內容更易被追溯

Before:

check在命名時沒有精確指向具體內容适滓,編輯器檢索check變量時唱歧,將會返回check、checkName、checkAge的相關結果颅崩,追溯成本變高

const data = {
  check: false,
  checkName: false,
  checkAge: false
}

After:

使用更精確的命名法則,提升代碼的可讀性與可追溯性

const data = {
  checkType: false,
  checkName: false,
  checkAge: false
}

3蕊苗、直截了當?shù)胤祷亟Y果

示例1

Before:

function getData(val) {
  if (val === 'A') {
    return true
  } else {
    return false
  }
  // or 
  return val === 'A' ? true : false
}

After:

針對布爾值結果可直接返回運算式本身

function getData(val) {
  return val === 'A'
}

示例2

Before:

function getData(val) {
  if (val === 'A') {
    return 'A'
  } else if (val === 'B') {
    return 'B'
  } else if (val === 'C') {
    return 'C'
  }
}

After:

針對使用結果與判定依據(jù)都是變量自身時沿后,使用集合式判斷直接輸出自身

function getData(val) {
  if (['A', 'B', 'C'].includes(val)) {
    return val
  }
}

4、用對象處理值的映射關系

示例1

Before:

function getDict(val) {
  switch(val) {
    case '0':
      return '選項1'
      break
    case '1':
      return '選項2'
      break
    case '2':
      return '選項3'
      break
    default: 
      return '沒有值'
  }
}

After:

從0開始的有序枚舉使用數(shù)組來定義朽砰,更簡潔明了的書寫方式尖滚,且無視val值是字符串或數(shù)字類型,適用于有序且少量枚舉時

function getDict(val) {
  return ['選項1', '選項2', '選項3'][val] || '沒有值'
}

示例2

Before:

function getDict(val) {
  switch(val) {
    case 'A':
      return '選項1'
      break
    case 'B':
      return '選項2'
      break
    case 'C':
      return '選項3'
      break
    default: 
      return '沒有值'
  }
}

After:

非數(shù)值型或數(shù)值型的值都可以使用對象來定義瞧柔,數(shù)值型仍無視val值是字符串或數(shù)字類型

function getDict(val) {
  return {
    A: '選項1',
    B: '選項2',
    C: '選項3'
  }[val] || '沒有值'
}

function getDict(val) {
  return {
    '-1': '選項1',
    '2': '選項2',
    '3': '選項3'
  }[val] || '沒有值'
}

5漆弄、減少不必要的引用關系

示例1

Before:

const columns = [{
  label: '姓名',
  prop: 'name'
}, {
  label: '年齡',
  prop: 'age'
}]

const data = {
  columns: columns
}

After:

const data = {
  columns: [{
    label: '姓名',
    prop: 'name'
  }, {
    label: '年齡',
    prop: 'age'
  }]
}

6、用對象囊括相應的變量

Before:

const data = {
  dialogTitle: '添加用戶',
  dialogWidth: '50%',
  dialogType: 'add',
  dialogVisible: false,
  dialogComponent: demoItem
}

After:

const data = {
  dialog: {
    title: '添加用戶',
    width: '50%',
    type: 'add',
    visible: false,
    component: demoItem
  }
}

7造锅、用適合的方式匹配數(shù)組中的項

操作對象數(shù)組項時

單項操作

Before:

性能優(yōu)撼唾,但可讀性與可維護性差,數(shù)據(jù)源缺乏可追溯性哥蔚,不知道具體操作的是哪個項倒谷,后期對數(shù)組增刪數(shù)據(jù)時,相應的索引可能會產(chǎn)生變化

list[1].hidden = false

After:

性能良糙箍,可讀性與可維護性強渤愁,直觀看到操作的是哪個數(shù)據(jù)項,可以通過關鍵屬性快速檢索到相應代碼深夯,后期對數(shù)組增刪數(shù)據(jù)時該方法都不受影響

list.find(item => item.prop === 'name').hidden = false

多項操作

Before:

性能差(非絕對)抖格,多次書寫,多次遍歷

list.find(item => item.prop === 'name').hidden = false
list.find(item => item.prop === 'age').hidden = false
list.find(item => item.prop === 'sex').hidden = false

After:

性能良(非絕對)咕晋,僅遍歷一次雹拄,并且保持find方法的可讀性與可維護性

for (const item of list) {
  if (['name', 'age', 'sex'].includes(item.prop)) {
    item.hidden = false
  }
}

注:如若list數(shù)組長度過大,且匹配的項都在數(shù)組末尾時捡需,After中的示例性能可能變得更差办桨,After中的示例適用于大部分場景,但并非絕對站辉,需依具體場景做決策


8呢撞、同類事務都交由單個方法處理

Before:

const inputEvent = {
  change: val => {
    if (val) {
      setData(val)
    } else {
      data.content = ''
    }
  }
}

async function setData(val) {
  const res = await $vue.api.getContent({ key: val })
  data.content = res
}

After:

const inputEvent = {
  change: setData
}

async function setData(val) {
  if (val) {
    const res = await $vue.api.getContent({ key: val })
    data.content = res
  } else {
    data.content = ''
  }
}

9、多個異步任務同時運行

Before:

逐個運行饰剥,假設接口A耗時2秒殊霞,接口B耗時3秒,該方法總計等待時長約5秒

async function getData(val) {
  const params = { key: val }
  const res1 = await $vue.api.getContent1(params)
  const res2 = await $vue.api.getContent2(params)
  if (res1 && res2) {
    // code
  }
}

After:

同時運行汰蓉,該方法只等待最長響應時長接口B的3秒

async function getData(val) {
  const params = { key: val }
  const [res1, res2] = await Promise.all([
    $vue.api.getContent1(params),
    $vue.api.getContent2(params)
  ])
  if (res1 && res2) {
    // code
  }
}

10绷蹲、使用別名方式引入資源(Vue)

針對層級過多的路徑

<template>中的資源

Before:

<img src="../../../assets/images/empty.png">

After:

<img src="@/assets/images/empty.png">

<script>中的資源

Before:

import attachmentList from '../../../views/common/attachmentList'

After:

import attachmentList from '@/views/common/attachmentList'

<style>中的資源

Before:

.text-underline {
  background-image: url('../../../assets/images/empty.png');
}

After:

.text-underline {
  background-image: url('~@/assets/images/empty.png');
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祝钢,更是在濱河造成了極大的恐慌比规,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拦英,死亡現(xiàn)場離奇詭異蜒什,居然都是意外死亡,警方通過查閱死者的電腦和手機疤估,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門灾常,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铃拇,你說我怎么就攤上這事钞瀑。” “怎么了慷荔?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵雕什,是天一觀的道長。 經(jīng)常有香客問我拧廊,道長监徘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任吧碾,我火速辦了婚禮凰盔,結果婚禮上,老公的妹妹穿的比我還像新娘倦春。我一直安慰自己户敬,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布睁本。 她就那樣靜靜地躺著尿庐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呢堰。 梳的紋絲不亂的頭發(fā)上抄瑟,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音枉疼,去河邊找鬼皮假。 笑死,一個胖子當著我的面吹牛骂维,可吹牛的內容都是我干的惹资。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼航闺,長吁一口氣:“原來是場噩夢啊……” “哼褪测!你這毒婦竟也來了猴誊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侮措,失蹤者是張志新(化名)和其女友劉穎懈叹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萝毛,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡项阴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笆包。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡略荡,死狀恐怖庵佣,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情汛兜,我是刑警寧澤巴粪,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站粥谬,受9級特大地震影響肛根,放射性物質發(fā)生泄漏。R本人自食惡果不足惜漏策,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一派哲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掺喻,春花似錦芭届、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至即硼,卻和暖如春逃片,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背只酥。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工褥实, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人层皱。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓性锭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叫胖。 傳聞我的和親對象是個殘疾皇子草冈,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容