成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

反思JavaScript:論for循環的死亡

開發 前端
你會如何進一步分解這些函數?仔細想想“小于”或者name屬性、map或filter,說不定能有額外的收獲。你還可以研究下函數的復合,收益更大。

我們一直在使用JavaScript的for循環。但現在,在最新的函數式編程技巧的支持下,過時的它應該退休了。幸運的是,你不必是一個函數式編程大師,也可以做出這個改變。更幸運的是,這就是你在眼前項目中可以立馬做的事情!

[[183082]]

我們一直在使用JavaScript的for循環。但現在,在最新的函數式編程技巧的支持下,過時的它應該退休了。

幸運的是,你不必是一個函數式編程大師,也可以做出這個改變。更幸運的是,這就是你在眼前項目中可以立馬做的事情!

那到底JavaScript的for循環有什么問題?

for循環設計本身鼓勵改變狀態以及產生副作用,這兩者都是導致錯誤和不可預知代碼的隱患。

我們都知道全局狀態是糟糕的,應該避免。可是,局部狀態和全局狀態一樣糟糕,只是因為局部狀態處于一個較小的尺度中,沒有引起注意。因此,我們從來沒有真正解決問題,而是盡量把問題最小化。

對于可變的狀態,在一些未知的時間點,變量會因為某些未知的原因而改變。這時,你要花上數小時進行調試,尋找這個值改變的原因。光為這,我都不知道自己掉了多少把頭發了。

下面,我想簡單談談副作用。這個詞聽起來就煩人,副作用……媽蛋!難道你會希望自己的程序有什么副作用?當然不!

但什么是副作用?

當一個函數修改了其作用域以外的某些東西時,它就被視為有副作用。可以是改變一個變量的值、讀取鍵盤輸入、調用某個API、寫入磁盤數據、打印日志,等等。

副作用很強大,但同時也被承擔著重大的責任。

副作用應該盡可能被消除,或者封裝在內部,或可控。有副作用的函數難以測試,也難以推斷,所以要盡你所能甩掉它。幸好這里可以不用擔心副作用。

好了,閑話少說,上代碼。我們看一下這段或許你已經看過上千次典型的for循環:

  1. const cats = [ 
  2.   { name: 'Mojo',    months: 84 }, 
  3.   { name: 'Mao-Mao', months: 34 }, 
  4.   { name: 'Waffles', months: 4 }, 
  5.   { name: 'Pickles', months: 6 } 
  6.  
  7. var kittens = [] 
  8.  
  9. // 典型的拙劣寫法:for循環 
  10. for (var i = 0; i < cats.length; i++) { 
  11.   if (cats[i].months < 7) { 
  12.     kittens.push(cats[i].name) 
  13.   } 
  14.  
  15. console.log(kittens) 

我計劃將這些代碼一步一步重構,讓你清楚地看到將這些代碼轉換成更漂亮的寫法是多么容易。

第一個改變就是把if里的聲明抽象為一個函數:

  1. const isKitten = cat => cat.months < 7 
  2.  
  3. var kittens = [] 
  4.  
  5. for (var i = 0; i < cats.length; i++) { 
  6.   if (isKitten(cats[i])) { 
  7.     kittens.push(cats[i].name) 
  8.   } 

通常,抽出if語句是個不錯的做法。過濾的著眼點從“小于7個月”轉變為“是一只小貓”非常非常重要。現在,當你再看這段代碼,意圖就變得清晰了。為什么要取得小于7個月的貓?一點都不明確。我們的意圖是找到小貓,所以讓代碼表示出來!

另一個好處是iskitten現在可復用了,而且我們都明白:

讓代碼可復用應該始終是我們的目標之一。

下一個改變就是提取出從對象貓到貓名字的轉換(或者映射)。這個變化對以后更有意義,現在只要相信我就好了:

  1. const isKitten = cat => cat.months < 7 
  2. const getName = cat => cat.name 
  3.  
  4. var kittens = [] 
  5.  
  6. for (var i = 0; i < cats.length; i++) { 
  7.   if (isKitten(cats[i])) { 
  8.     kittens.push(getName(cats[i])) 
  9.   } 

我本打算先介紹一下filter和map的,但轉念一想,還是直接展示引入它們之后的代碼多好理解,更能讓你體會到代碼可讀性的巨大變化:

  1. const isKitten = cat => cat.months < 7 
  2. const getName = cat => cat.name 
  3.  
  4. const kittens = 
  5.   cats.filter(isKitten) 
  6.       .map(getName) 

還要注意,我們已經消除了 kittens.push(...)。不再有可變的狀態,也不再有var!

使用const的代碼有如魔鬼般性感(超過了var和let)。

這里說明下,我們自始至終都可以使用const,因為const并不會使對象本身不可變(這個咱們下次再說)。別急,這里只是在講一個范例,所以先放我一馬!

重構的最后一步就是把過濾和映射方法也提取到一個函數里(為了復用嘛,你懂的):

整合一起就是這樣:

  1. const isKitten = cat => cat.months < 7 
  2. const getName = cat => cat.name 
  3. const getKittenNames = cats => 
  4.   cats.filter(isKitten) 
  5.       .map(getName) 
  6.  
  7. const cats = [ 
  8.   { name: 'Mojo',    months: 84 }, 
  9.   { name: 'Mao-Mao', months: 34 }, 
  10.   { name: 'Waffles', months: 4 }, 
  11.   { name: 'Pickles', months: 6 } 
  12.  
  13. const kittens = getKittenNames(cats) 
  14.  
  15. console.log(kittens) 

你會如何進一步分解這些函數?仔細想想“小于”或者name屬性、map或filter,說不定能有額外的收獲。你還可以研究下函數的復合,收益更大。

原    文:Rethinking JavaScript: Death of the For Loop
譯    文:眾成翻譯
作    者:camiler
責任編輯:張燕妮 來源: 眾成翻譯
相關推薦

2012-01-18 09:26:05

SaaS云計算

2012-07-06 13:54:59

JavaScript

2011-05-25 16:23:35

Javascript類繼承

2014-03-14 10:07:09

極限編程敏捷開發

2017-03-28 21:25:19

無循環代碼JavaScript

2022-03-11 14:59:21

JavaScript數組字符串

2016-09-06 21:23:25

JavaScriptnode異步

2011-09-16 15:10:46

Android應用IOS應用Death App

2013-05-28 00:35:48

JavaScriptfor循環

2022-01-12 15:50:24

JavaScript開發循環

2017-01-20 08:30:19

JavaScriptfor循環

2015-08-11 08:51:40

游戲死亡

2020-03-02 19:28:03

人工智能AI

2012-07-16 09:45:44

降級論傻蛋

2012-11-26 10:11:41

移動支付平臺移動云計算

2011-10-17 08:29:33

Ubuntu 11.1思考

2014-02-13 17:21:23

技術創業

2021-04-07 22:31:51

人臉識別人工智能隱私

2021-08-08 11:17:58

谷歌Matt編程

2023-09-13 08:00:00

JavaScript循環語句
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品一区二区三区中文字幕 | 最新毛片网站 | 好婷婷网 | 成人午夜电影在线观看 | 免费能直接在线观看黄的视频 | 特级毛片www | 日韩字幕一区 | 天天久久 | 天堂一区二区三区 | 午夜丰满寂寞少妇精品 | 91在线视频一区 | 久久久久久高潮国产精品视 | 欧美高清免费 | 午夜爽爽男女免费观看hd | 国产亚洲精品精品国产亚洲综合 | 亚洲精品视频免费 | 青青草原综合久久大伊人精品 | 日韩av一区二区在线观看 | 久久999| 久草网址 | 久久中文字幕一区 | 国内精品伊人久久久久网站 | 精品综合久久 | 日日操夜夜操天天操 | 嫩草黄色影院 | 精品九九久久 | 视频在线一区 | 亚洲在线一区二区 | 成人精品一区二区 | 国产午夜精品一区二区三区四区 | 久久精品国产99国产精品亚洲 | 午夜99| 国产电影一区二区三区爱妃记 | 欧美一区2区三区4区公司二百 | 中文字幕在线一区二区三区 | 久久久久综合 | 亚洲视频中文字幕 | 视频一区二区三区四区五区 | 久久国产婷婷国产香蕉 | 蜜桃在线播放 | 男人的天堂久久 |