亚洲综合丝袜美腿_精品一区二区免费_日韩视频一区二区三区在线播放 _7878成人国产在线观看_精品一区二区三区视频在线观看_1024亚洲合集_日韩美女在线视频_欧美怡红院视频_国产一区 二区_亚洲视频 欧洲视频_99精品一区二区_亚洲va欧美va人人爽午夜_精品国产一区二区三区不卡_蜜臀av一区二区_欧美日韩精品一区二区_亚洲精品中文在线

當前位置: 首頁 > 科技新聞 >

如何讓你的JS寫得更漂亮

時間:2019-11-13 01:05來源:網絡整理 瀏覽:
網上有不少關于JS編寫優化建議,這里我根據自己的經驗提出一些比較有用的意見。 1. 按強類型風格寫代碼 JS是弱類型的,但是寫代碼的時候不

如何讓你的JS寫得更漂亮

網上有不少關于JS編寫優化建議,這里我根據自己的經驗提出一些比較有用的意見。

1. 按強類型風格寫代碼

JS是弱類型的,但是寫代碼的時候不能太隨意,寫得太隨意也體現了編碼風格不好。下面分點說明:

(1)定義變量的時候要指明類型,告訴JS解釋器這個變量是什么數據類型的,而不要讓解釋器去猜,例如不好的寫法:

 

聲明了三個變量,但其實沒什么用,因為解釋器不知道它們是什么類型的,好的寫法應該是這樣的:

 

定義變量的時候就給他一個默認值,這樣不僅方便了解釋器,也方便了閱讀代碼的人,他會在心里有數——知道這些變量可能會當作什么用。

(2)不要隨意地改變變量的類型,例如下面代碼:

 

第1行它是一個整型,第2行它變成了一個字符串。因為JS最終都會被解釋成匯編的語言,匯編語言變量的類型肯定是要確定的,你把一個整型的改成了字符串,那解釋器就得做一些額外的處理。并且這種編碼風格是不提倡的,有一個變量第1行是一個整型,第10行變成了一個字符串,第20行又變成了一個object,這樣就讓閱讀代碼的人比較困惑,上面明明是一個整數,怎么突然又變成一個字符串了。好的寫法應該是再定義一個字符串的變量:

 

(3)函數的返回類型應該是要確定的,例如下面不確定的寫法:

 

getPrice這個函數有可能返回一個整數,也有可能返回一個空的字符串。這樣寫也不太好,雖然它是符合JS語法的,但這種編碼風格是不好的。使用你這個函數的人會有點無所適從,不敢直接進行加減乘除,因為如果返回字符串進行運算的話值就是NaN了。函數的返回類型應該是要確定的,如下面是返回整型:

 

然后告訴使用者,如果返回-1就表示不合法。如果類型確定,解釋器也不用去做一些額外的工作,可以加快運行速度。

2. 減少作用域查找

(1)不要讓代碼暴露在全局作用域下

例如以下運行在全局作用域的代碼:

  

有時候你需要在頁面直接寫一個script,要注意在一個script標簽里面,代碼的上下文都是全局作用域的,由于全局作用域比較復雜,查找比較慢。例如上面的map變量,第二行在使用的時候,需要在全局作用域查找一下這個變量,假設map是在一個循環里面使用,那可能就會有效率問題了。所以應該要把它搞成一個局部的作用域:

  

上面用了一個function制造一個局部作用域,也可以用ES6的塊級作用域。由于map這個變量直接在當前的局部作用域命中了,所以就不用再往上一級的作用域(這里是全局作用域)查找了,而局部作用域的查找是很快的。同時直接在全局作用域定義變量,會污染window對象。

(2)不要濫用閉包

閉包的作用在于可以讓子級作用域使用它父級作用域的變量,同時這些變量在不同的閉包是不可見的。這樣就導致了在查找某個變量的時候,如果當前作用域找不到,就得往它的父級作用域查找,一級一級地往上直到找到了,或者到了全局作用域還沒找到。因此如果閉包嵌套得越深,那么變量查找的時間就越長。如下:

 

上面的代碼定義了一個process函數,在這個函數里面count變量的查找時間要高于局部的factor變量。其實這里不太適合用閉包,可以直接把count傳給process:

 

這樣count的查找時間就和factor一樣,都是在當前作用域直接命中。這個就啟示我們如果某個全局變量需要頻繁地被使用的時候,可以用一個局部變量緩存一下,如下:

 

頻繁地使用了window.location對象,所以可以先把它緩存一下:

 

搞成了一個局變變量,這樣查找就會明顯快于全局的查找,代碼也可以寫少一點。

3. 避免==的使用

這里你可能會有疑問了,有些人喜歡用==,有些人喜歡用===,大家的風格不一樣,你為什么要強制別人用===呢?習慣用==的人,不能僅僅是因為==比===少敲了一次鍵盤。為什么不提倡用==呢?

(1)如果你確定了變量的類型,那么就沒必要使用==了,如下:

 

上面的兩個例子都是確定類型的,一個是字符串,一個是整數。就沒必要使用==了,直接用===就可以了。

(2)如果類型不確定,那么應該手動做一下類型轉換,而不是讓別人或者以后的你去猜這里面有類型轉換,如下:

 

(3)使用==在JSLint檢查的時候是不通過的:

 

如下JSLint的輸出:

  

(4)并且使用==可能會出現一些奇怪的現象,這些奇怪的現象可能會給代碼埋入隱患:

 

上面的比較在用===的時候都是false,這樣才是比較合理的。例如第一點null居然會等于undefined,就特別地奇怪,因為null和undefined是兩個毫無關系的值,null應該是作為初始化空值使用,而undefined是用于檢驗某個變量是否未定義。

這和第1點介紹強類型的思想是相通的。

4. 合并表達式

如果用1句代碼就可以實現5句代碼的功能,那往往1句代碼的執行效率會比較高,并且可讀性可能會更好

(1)用三目運算符取代簡單的if-else

如上面的getPrice函數:

 

可以改成:

 

這個比寫一個if-else看起來清爽多了。當然,如果你寫了if-else,壓縮工具也會幫你把它改三目運算符的形式:

 

(2)連等

連等是利用賦值運算表達式會返回所賦的值,并且執行順序是從右到左的,如下:

 

有時候你會看到有人這樣寫:

 

也是利用了賦值表達式會返回一個值,在if里面賦值的同時用它的返回值做判斷,然后else里面就已經有值了。上面的+號把字符串轉成了整數。

(3)自增

利用自增也可以簡化代碼。如下,每發出一條消息,localMsgId就自增1:

 

5. 減少魔數

例如,在某個文件的第800行,冒出來了一句:

 

就會讓人很困惑了,上面的四個常量分別代表什么呢,如果我不去查一個那個函數的變量說明就不能夠很快地意會到這些常量分別有什么用。這些意義不明的常量就叫“魔數”。

所以最好還是給這些常量取一個名字,特別是在一些比較關鍵的地方。例如上面的代碼可改成:

 

這樣意義就很明顯了。

6. 使用ES6簡化代碼

ES6已經發展很多年了,兼容性也已經很好了。恰當地使用,可以讓代碼更加地簡潔優雅。

(1)使用箭頭函數取代小函數

有很多使用小函數的場景,如果寫個function,代碼起碼得寫3行,但是用箭頭函數一行就搞定了,例如實現數組從大到小排序:

 

如果用箭頭函數,排序只要一行就搞定了:

 

代碼看起來簡潔多了,還有setTimeout里面經常會遇到只要執行一行代碼就好了,寫個function總感覺有點麻煩,用字符串的方式又不太好,所以這種情況用箭頭函數也很方便:

 

箭頭函數在C++/Java等其它語言里面叫做Lambda表達式,Ruby比較早就有這種語法形式了,后來C++/Java也實現了這種語法。

當然箭頭函數或者Lambda表達式不僅適用于這種一行的,多行代碼也可以,不過在一行的時候它的優點才比較明顯。

(2)使用ES6的class

雖然ES6的class和使用function的prototype本質上是一樣的,都是用的原型。但是用class可以減少代碼量,同時讓代碼看起來更加地高大上,使用function要寫這么多:

 

使用class代碼看加地簡潔易懂:

 

并且class還可以很方便地實現繼承、靜態的成員函數,就不需要自己再去通過一些技巧去實現了。

(3)字符串拼接

以前要用+號拼接:

   

現在只要用兩個反引號“`”就可以了:

   

另外反引號還支持占位替換,原本你需要:

 

現在只需要:

 

就不用使用+號把字符串拆散了。

(4)塊級作用域變量

塊級作用域變量也是ES6的一個特色,下面的代碼是一個任務隊列的模型抽象:

 

但是上面代碼的執行輸出是4,4,4,4,并且不是想要輸出:0,1,2,3,所以每個task就不能取到它的index了,這是因為閉包都是用的同一個i變量,i已經變成4了,所以執行閉包的時候就都是4了。那怎么辦呢?可以這樣解決:

 

把i賦值給了k,由于k它是一個function的一個參數,每次執行函數的時候,肯定會實例化新的k,所以每次的k都是不同的變量,這樣就輸出就正常了。

但是代碼看起來有點別扭,如果用ES6,只要把var改成let就可以了:

 

只改動了3個字符就達到了目的。因為for循環里面有個大括號,大括號就是一個獨立的作用域,let定義的變量在獨立的作用域里面它的值也是獨立的。當然即使沒寫大括號for循環執行也是獨立的。

除了以上幾點,ES6還有其它一些比較好用的功能,如Object的assign,Promise等,也是可以幫助寫出簡潔高效的代碼。

以上列了我自己在實際寫代碼過程中遇到的一些問題和一些個人認為比較重要的方面,其它的還有變量命名、縮進、注釋等,這里就不提及了。寫代碼的風格也體現了編程的素養,有些人的代碼看起來非常地干凈利落,而有些人的代碼看起來讓人比較痛苦。這種編程素質的提升需要有意識地去做一些改進,有些人雖然代碼寫得很爛,但是他自己并不覺得有什么問題。這就需要多去學下別人的代碼,甚至學一下其它語言的書寫,兩者一比較就能發現差異,或者看下這方面的書,像什么代碼大全之類的。

【責任編輯:龐桂玉 TEL:(010)68476606】
推薦內容
亚洲综合丝袜美腿_精品一区二区免费_日韩视频一区二区三区在线播放 _7878成人国产在线观看_精品一区二区三区视频在线观看_1024亚洲合集_日韩美女在线视频_欧美怡红院视频_国产一区 二区_亚洲视频 欧洲视频_99精品一区二区_亚洲va欧美va人人爽午夜_精品国产一区二区三区不卡_蜜臀av一区二区_欧美日韩精品一区二区_亚洲精品中文在线
欧美色电影在线| 日韩欧美第一区| 欧美久久高跟鞋激| 久久蜜臀中文字幕| 亚洲成人免费视频| av亚洲精华国产精华精| 日韩免费看的电影| 亚洲高清免费在线| 99精品视频中文字幕| 久久久777精品电影网影网 | 久久只精品国产| 天天色天天操综合| 日本乱人伦一区| 中文字幕一区二区三区四区| 国产剧情一区在线| 亚洲精品一区二区三区福利| 日韩精品高清不卡| 欧美视频精品在线观看| 亚洲日本在线视频观看| caoporn国产一区二区| 国产午夜亚洲精品不卡| 狠狠久久亚洲欧美| 欧美不卡一区二区三区四区| 亚洲gay无套男同| 欧美午夜精品一区二区蜜桃| 亚洲免费观看高清完整版在线观看| 风间由美一区二区av101| 久久久蜜桃精品| 欧美一级午夜免费电影| 亚洲mv大片欧洲mv大片精品| 欧美色区777第一页| 亚洲激情在线播放| 色噜噜狠狠成人网p站| 亚洲精品中文在线影院| 91国偷自产一区二区使用方法| 亚洲乱码国产乱码精品精可以看 | 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产精品久久久99| 99综合影院在线| 国产精品精品国产色婷婷| 成人少妇影院yyyy| 国产精品系列在线| eeuss影院一区二区三区| 亚洲人成影院在线观看| 色一情一乱一乱一91av| 亚洲五码中文字幕| 欧美日本视频在线| 欧美aaaaaa午夜精品| 欧美xxxxx牲另类人与| 中文字幕一区二区三区四区不卡| 99re成人在线| 一区二区三区在线观看视频 | 日韩毛片视频在线看| 91影院在线免费观看| 一区二区三区蜜桃| 欧美精品丝袜中出| 奇米影视7777精品一区二区| 精品国产一区二区三区久久影院 | 欧美日产在线观看| 男人操女人的视频在线观看欧美 | 免费成人深夜小野草| 精品美女被调教视频大全网站| 国模娜娜一区二区三区| 中文字幕二三区不卡| 色综合色狠狠天天综合色| 亚洲高清免费观看高清完整版在线观看 | 亚洲h在线观看| 日韩欧美一区中文| 风流少妇一区二区| 亚洲视频一区在线| 欧美四级电影网| 久久精品久久精品| 久久九九全国免费| 色综合久久综合| 日韩在线一区二区| 精品成人佐山爱一区二区| 成年人国产精品| 亚洲成人资源网| 2020国产精品自拍| 99久久精品99国产精品| 香蕉影视欧美成人| 国产日韩欧美综合在线| 色天天综合色天天久久| 蜜桃av一区二区| 国产精品久久久久久久午夜片| 欧美视频在线观看一区| 激情综合色丁香一区二区| 中文字幕日韩av资源站| 欧美日韩一区二区不卡| 国产精品66部| 亚洲午夜日本在线观看| 久久久久久久久免费| 91国偷自产一区二区使用方法| 久久精品国产77777蜜臀| 中文字幕在线观看一区| 欧美一级片在线看| 成人黄动漫网站免费app| 婷婷中文字幕综合| 国产欧美一二三区| 欧美日韩一区国产| 国产91丝袜在线观看| 日日骚欧美日韩| 国产精品午夜免费| 欧美男男青年gay1069videost | 欧美日韩国产三级| 国产一区免费电影| 亚洲一二三四区| 久久久久久久久一| 欧美日韩极品在线观看一区| 国产一区二区三区国产| 亚洲国产视频一区| 欧美激情中文不卡| 欧美一区二区视频观看视频| eeuss影院一区二区三区| 捆绑调教美女网站视频一区| 亚洲精品亚洲人成人网| 久久久99久久精品欧美| 国产精品一区久久久久| 亚洲综合丝袜美腿| jlzzjlzz亚洲女人18| 久久精品国产亚洲aⅴ| 一区二区三区在线免费播放| 久久久久高清精品| 91精品福利在线一区二区三区| 99精品视频在线观看| 久久66热偷产精品| 午夜成人在线视频| 亚洲视频 欧洲视频| 久久久精品中文字幕麻豆发布| 欧美日高清视频| 色综合中文字幕国产 | 国产精品综合二区| 国产精品视频一二| 欧美成人三级在线| 欧美日韩国产小视频在线观看| 波多野洁衣一区| 韩国精品久久久| 丝袜美腿亚洲一区二区图片| 一区二区三区中文字幕| 国产精品久久久久久久久动漫| 日韩精品综合一本久道在线视频| 91国模大尺度私拍在线视频| 粉嫩av亚洲一区二区图片| 欧美aⅴ一区二区三区视频| 亚洲美女少妇撒尿| 国产欧美日韩中文久久| 精品国产不卡一区二区三区| 欧美日韩不卡视频| 一本色道久久综合亚洲91 | 极品销魂美女一区二区三区| 天天操天天综合网| 亚洲激情一二三区| 中文字幕一区二区三区av| 欧美大片日本大片免费观看| 欧美亚洲动漫另类| 色婷婷久久久亚洲一区二区三区| 成人视屏免费看| 成人午夜电影网站| 成人中文字幕合集| 国模套图日韩精品一区二区| 九九视频精品免费| 麻豆精品一区二区三区| 免费黄网站欧美| 国产欧美日韩三区| 2020国产成人综合网| 亚洲精品一区二区在线观看| 日韩一区二区三区视频在线| 这里是久久伊人| 欧美日韩第一区日日骚| 日本精品裸体写真集在线观看| 成人国产精品免费观看动漫| 国模冰冰炮一区二区| 国产自产v一区二区三区c| 久久精品国产网站| 久久国产精品99精品国产| 日本美女一区二区三区| 免费看欧美美女黄的网站| 欧美aaa在线| 久久国产生活片100| 看电视剧不卡顿的网站| 男人的天堂亚洲一区| 精品一区二区三区在线观看 | 国产一区999| 国产原创一区二区三区| 美女一区二区视频| 精品一区二区三区在线播放视频| 久久99精品久久久久久久久久久久| 美女视频一区二区| 美女网站在线免费欧美精品| 久久精品国产99国产精品| 美女视频黄久久| 国产黄色91视频| 成人福利电影精品一区二区在线观看| 国产精品亚洲一区二区三区妖精 | 91免费精品国自产拍在线不卡| 色婷婷综合久久久中文字幕| 99国产精品久久久久| 日本道在线观看一区二区| 欧美一区二区不卡视频| 亚洲精品一区二区三区福利|