如何寫(xiě)出優(yōu)雅的Javascript代碼

筆者以前寫(xiě)Javascript的時(shí)候漓摩,經(jīng)常會(huì)把代碼寫(xiě)的又臭又長(zhǎng)又啰嗦裙士。

在經(jīng)過(guò)一段實(shí)踐的實(shí)踐和反思后,代碼的優(yōu)雅性應(yīng)該提高很多管毙。
所以個(gè)人就總結(jié)了寫(xiě)出優(yōu)雅Javascript代碼的心得腿椎。

不寫(xiě)分號(hào)

不寫(xiě)分號(hào)能顯著讓代碼更加優(yōu)雅,并少輕松你的雙手夭咬。
可能很多人會(huì)有疑問(wèn)啃炸,沒(méi)有分號(hào)的Javascript也能正常運(yùn)行?
幾乎是的卓舵。不過(guò)在一些特殊的時(shí)候Javascript引擎并不會(huì)幫助你正確插入分號(hào)南用。
具體的情況只有這五個(gè)符號(hào):+- 掏湾,(裹虫, [/
沒(méi)了融击。
也就是說(shuō)筑公,凡是新的一行代碼以上述五個(gè)符號(hào)開(kāi)頭,那么之前一句的末尾是需要分號(hào)的尊浪。
而在實(shí)際情況中匣屡,以+,- 開(kāi)頭的新一行代碼幾乎不可能出現(xiàn)拇涤。
所以可能情況:

(function(){
  // do something
})()

如果之前沒(méi)加分號(hào)耸采,那么這個(gè)匿名函數(shù)外的括號(hào)會(huì)調(diào)用上一行定義的函數(shù),匿名函數(shù)就變成了參數(shù)工育。記住下面的這個(gè)分號(hào)

;(function(){
  // do something
})()

還有比如這樣

;(a == 1 || b == 1) && fn()

;[].slice.call()

;/abc/.test('abcd')

除了上面例子,幾乎沒(méi)有其他情景需要加分號(hào)了搓彻。
所以經(jīng)常遇到這種情況如绸,一個(gè)javascript文件里幾百個(gè)分號(hào)全是沒(méi)必要的。
而且旭贬,通常在生產(chǎn)環(huán)境中會(huì)提前用uglify.js去壓縮代碼怔接,或是用ES6時(shí)babel轉(zhuǎn)碼,這都會(huì)幫你補(bǔ)全分號(hào)稀轨。
所以還有什么理由去寫(xiě)分號(hào)呢扼脐?
當(dāng)然寫(xiě)不寫(xiě)分號(hào)也屬于個(gè)人習(xí)慣,知道什么時(shí)候分號(hào)是不可省的才是重點(diǎn)。
PS:Vue.js的源碼就是不寫(xiě)分號(hào)的瓦侮。

使用ES6

相比較ES5艰赞,ES6的語(yǔ)法中的結(jié)構(gòu)賦值,箭頭函數(shù)肚吏,模板字符串方妖,對(duì)象的簡(jiǎn)寫(xiě)法等都能讓代碼變得干凈利落。
比如一個(gè)判斷奇偶的函數(shù)

function isEven(x){
    return x % 2 == 0
}

ES6:

const isEven = x => x % 2 == 0

比如字符串拼接

dom.innerHTML='Hello '
    + name
    + ',How you today?'

ES6:

dom.innerHTML=`Hello 
    ${name}
    How you today?`

一些優(yōu)雅的寫(xiě)法

邏輯運(yùn)算符

if (a == 1) {
    b()
}
//可以寫(xiě)成
a == 1 && b()

初始化變量

var a = obj || {}

三元運(yùn)算符

var a = b % 2 == 0 ? 'even' : 'odd'

合理的命名

具體來(lái)說(shuō)有這樣幾點(diǎn):

  • 方法名以動(dòng)詞開(kāi)頭罚攀,比如 var getName = function(){}
  • 布爾值以is開(kāi)頭党觅,var isEven = function(x){return x % 2 == 0}
  • 駝峰大小寫(xiě)和下劃線(xiàn)不要混用,比如whatTheHellwhat_the_hell
  • 下劃線(xiàn)只有在私有對(duì)象屬性時(shí)使用
  • 方法內(nèi)部變量盡可能短

變量聲明

變量聲明盡可能的放在開(kāi)頭斋泄,這樣有助于:

  • 提供一個(gè)單一地址查找到函數(shù)所有需要的局部變量
  • 防止因聲明提升所引發(fā)的邏輯錯(cuò)誤
  • 幫助牢記要聲明的變量杯瞻,盡可能地少適用全局變量

使用逗號(hào)隔開(kāi)換行,而非每一行重新var

var a = 1
var b = 2
//換成
var a = 1,
    b = 2

有的時(shí)候也可以把逗號(hào)寫(xiě)在開(kāi)頭炫掐,這樣比較方便加入新的變量

var a = 1
   ,b = 2
   ,c = 3

對(duì)齊方式

var express =   require('express')
var path =      require('path')
var favicon =   require('serve-favicon')
var logger =    require('morgan')

實(shí)際上用var的時(shí)候是可以用逗號(hào)的魁莉。所以在ES6中更經(jīng)常出現(xiàn)的情況:

import Vue          from 'vue'
import VueResource  from 'vue-resource'
import VueValidator from 'vue-validator'
import VueRouter    from 'vue-router'
import Vuex         from 'vuex'

縮短常用方法名

var $ = function(x){
    return document.getElementById(x)
}

避免超長(zhǎng)代碼

如果代碼長(zhǎng)到底部的滾動(dòng)條都出現(xiàn)了,如何算得上優(yōu)雅呢卒废。
所以要保持每一行的代碼不要太長(zhǎng)沛厨,具體有這樣需要注意的地方:

  • 內(nèi)部不重要的過(guò)程性代碼盡可能短,但至少保留語(yǔ)義
  • 如果用到鏈?zhǔn)秸Z(yǔ)法摔认,可在 ' . '的開(kāi)頭換行
[].concat(arr).sort().forEach(fn)...

可以改成

[].concat(arr)
    .sort()
    .forEach(fn)...
  • 字符串拼接時(shí)逆皮,用加號(hào)換行,或用ES6的模板字符串
  • 如果因?yàn)檫壿嬤\(yùn)算符兒導(dǎo)致過(guò)長(zhǎng)参袱,可以將邏輯運(yùn)算符換行
  • 如果函數(shù)參數(shù)過(guò)長(zhǎng)电谣,可以將參數(shù)換行,也是沒(méi)問(wèn)題的
  • 盡可能避免嵌套過(guò)多的if語(yǔ)句
  • 如果還是很長(zhǎng)抹蚀,可以嘗試2個(gè)空格縮進(jìn)

其他細(xì)節(jié)

  • 代碼不同功能區(qū)之間加空行剿牺,比如每個(gè)funtion之間
  • 對(duì)于數(shù)組或類(lèi)數(shù)組,可以用map等函數(shù)替代for循環(huán)
  • + 號(hào)的運(yùn)算符之間加空格
  • 若多次引用同一外部對(duì)象的屬性环壤,則定義到方法內(nèi)部

最后

在實(shí)踐中還有很多可以注意的地方晒来,以后也會(huì)慢慢完善。
當(dāng)然郑现,也歡迎一起補(bǔ)充~~
寫(xiě)優(yōu)雅的代碼是很令人愉悅的湃崩。

代碼如詩(shī)~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市接箫,隨后出現(xiàn)的幾起案子攒读,更是在濱河造成了極大的恐慌,老刑警劉巖辛友,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薄扁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)邓梅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)脱盲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人震放,你說(shuō)我怎么就攤上這事宾毒。” “怎么了殿遂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵诈铛,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我墨礁,道長(zhǎng)幢竹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任恩静,我火速辦了婚禮焕毫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驶乾。我一直安慰自己邑飒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布级乐。 她就那樣靜靜地躺著疙咸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪风科。 梳的紋絲不亂的頭發(fā)上撒轮,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音贼穆,去河邊找鬼题山。 笑死,一個(gè)胖子當(dāng)著我的面吹牛故痊,可吹牛的內(nèi)容都是我干的顶瞳。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼愕秫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浊仆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起豫领,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舔琅,沒(méi)想到半個(gè)月后等恐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年课蔬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了囱稽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡二跋,死狀恐怖战惊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扎即,我是刑警寧澤吞获,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站谚鄙,受9級(jí)特大地震影響各拷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闷营,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一烤黍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧傻盟,春花似錦速蕊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至筝闹,卻和暖如春媳叨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背关顷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工糊秆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人议双。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓痘番,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親平痰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汞舱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容