前端工程師必備的js技巧

原文鏈接:http://www.reibang.com/p/c806c178ca69

1.判斷數(shù)據(jù)類型

使用 Object.prototype.toString 配合閉包麸粮,在保證判斷數(shù)據(jù)類型的準確性時弄诲,同時能讓這個函數(shù)非常靈活寂玲,通過傳入不同的判斷類型來返回不同的判斷函數(shù)(注意傳入 type 參數(shù)時首字母大寫)

2. ES5 實現(xiàn)數(shù)組 map 方法

值得一提的是,map 的第二個參數(shù)為第一個參數(shù)回調中的 this 指向断序,如果第一個參數(shù)為箭頭函數(shù)违诗,那設置第二個 this 會因為箭頭函數(shù)的詞法綁定而失效

3. 使用 reduce 實現(xiàn)數(shù)組 map 方法

4. ES5 實現(xiàn)數(shù)組 filter 方法

5. 使用 reduce 實現(xiàn)數(shù)組 filter 方法

6. ES5 實現(xiàn)數(shù)組的 some 方法

執(zhí)行 some 方法的數(shù)組如果是一個空數(shù)組愕乎,最終始終會返回false趁怔,而另一個數(shù)組的 every 方法中的數(shù)組如果是一個空數(shù)組润努,會始終返回true

7. ES5 實現(xiàn)數(shù)組的 reduce 方法

8. 使用 reduce 實現(xiàn)數(shù)組的 flat 方法

因為 selfFlat 是依賴 this 指向的,所以在 reduce 遍歷時需要指定 selfFlat 的 this 指向垛膝,否則會默認指向 window 從而發(fā)生錯誤

原理通過 reduce 遍歷數(shù)組倚聚,遇到數(shù)組的某個元素仍是數(shù)組時惑折,通過 ES6 的擴展運算符對其進行降維(ES5 可以使用 concat 方法)惨驶,而這個數(shù)組元素可能內部還嵌套數(shù)組粗卜,所以需要遞歸調用 selfFlat

同時原生的 flat 方法支持一個 depth 參數(shù)表示降維的深度休建,默認為 1 即給數(shù)組降一層維度

傳入 Inifity 會將傳入的數(shù)組變成一個一維數(shù)組

原理是每遞歸一次將 depth 參數(shù)減 1百匆,如果 depth 參數(shù)為 0 時,直接返回原數(shù)組

9.實現(xiàn) ES6 的 class 語法

ES6 的 class 內部是基于寄生組合式繼承,它是目前最理想的繼承方式纵东,通過 Object.create 方法創(chuàng)造一個空對象偎球,并將這個空對象繼承 Object.create 方法的參數(shù)衰絮,再讓子類(subType)的原型對象等于這個空對象猫牡,就可以實現(xiàn)子類實例的原型等于這個空對象淌友,而這個空對象的原型又等于父類原型對象(superType.prototype)的繼承關系

而 Object.create 支持第二個參數(shù),即給生成的空對象定義屬性和屬性描述符/訪問器描述符归薛,我們可以給這個空對象定義一個 constructor 屬性更加符合默認的繼承行為,同時它是不可枚舉的內部屬性(enumerable:false)

而 ES6 的 class 允許子類繼承父類的靜態(tài)方法和靜態(tài)屬性,而普通的寄生組合式繼承只能做到實例與實例之間的繼承苫昌,對于類與類之間的繼承需要額外定義方法祟身,這里使用 Object.setPrototypeOf 將 superType 設置為 subType 的原型袜硫,從而能夠從父類中繼承靜態(tài)方法和靜態(tài)屬性

10. 函數(shù)柯里化

使用方法:

柯里化是函數(shù)式編程的一個重要技巧,將使用多個參數(shù)的一個函數(shù)轉換成一系列使用一個參數(shù)的函數(shù)的技術

函數(shù)式編程另一個重要的函數(shù) compose秽澳,能夠將函數(shù)進行組合担神,而組合的函數(shù)只接受一個參數(shù)杏瞻,所以如果有接受多個函數(shù)的需求并且需要用到 compose 進行函數(shù)組合捞挥,就需要使用柯里化對準備組合的函數(shù)進行部分求值砌函,讓它始終只接受一個參數(shù)

借用冴羽博客中的一個例子

11. 函數(shù)柯里化(支持占位符)

使用方法:

通過占位符能讓柯里化更加靈活煌抒,實現(xiàn)思路是贩疙,每一輪傳入的參數(shù)先去填充上一輪的占位符这溅,如果當前輪參數(shù)含有占位符,則放到內部保存的數(shù)組末尾臭胜,當前輪的元素不會去填充當前輪參數(shù)的占位符,只會填充之前傳入的占位符

12. 偏函數(shù)

使用方法:

偏函數(shù)和柯里化概念類似仪壮,個人認為它們區(qū)別在于偏函數(shù)會固定你傳入的幾個參數(shù)烙心,再一次性接受剩下的參數(shù)爪瓜,而函數(shù)柯里化會根據(jù)你傳入?yún)?shù)不停的返回函數(shù)铆铆,直到參數(shù)個數(shù)滿足被柯里化前函數(shù)的參數(shù)個數(shù)

Function.prototype.bind 函數(shù)就是一個偏函數(shù)的典型代表薄货,它接受的第二個參數(shù)開始谅猾,為預先添加到綁定函數(shù)的參數(shù)列表中的參數(shù)税娜,與 bind 不同的是敬矩,上面的這個函數(shù)同樣支持占位符

13. 斐波那契數(shù)列及其優(yōu)化

利用函數(shù)記憶弧岳,將之前運算過的結果保存下來消略,對于頻繁依賴之前結果的計算能夠節(jié)省大量的時間瞎抛,例如斐波那契數(shù)列艺演,缺點就是閉包中的 obj 對象會額外占用內存

14. 實現(xiàn)函數(shù) bind 方法

函數(shù)的 bind 方法核心是利用 call,同時考慮了一些其他情況桐臊,例如

bind 返回的函數(shù)被 new 調用作為構造函數(shù)時胎撤,綁定的值會失效并且改為 new 指定的對象

定義了綁定后函數(shù)的 length 屬性和 name 屬性(不可枚舉屬性)

綁定后函數(shù)的原型需指向原來的函數(shù)

15. 實現(xiàn)函數(shù) call 方法

原理就是將函數(shù)作為傳入的上下文參數(shù)(context)的屬性執(zhí)行,這里為了防止屬性沖突使用了 ES6 的 Symbol 類型

16. 簡易的 CO 模塊

使用方法:

run 函數(shù)接受一個生成器函數(shù)断凶,每當 run 函數(shù)包裹的生成器函數(shù)遇到 yield 關鍵字就會停止伤提,當 yield 后面的 promise 被解析成功后會自動調用 next 方法執(zhí)行到下個 yield 關鍵字處,最終就會形成每當一個 promise 被解析成功就會解析下個 promise,當全部解析成功后打印所有解析的結果,衍變?yōu)楝F(xiàn)在用的最多的 async/await 語法

17. 函數(shù)防抖

leading 為是否在進入時立即執(zhí)行一次, trailing 為是否在事件觸發(fā)結束后額外再觸發(fā)一次帝牡,原理是利用定時器,如果在規(guī)定時間內再次觸發(fā)事件會將上次的定時器清除,即不會執(zhí)行函數(shù)并重新設置一個新的定時器,直到超過規(guī)定時間自動觸發(fā)定時器中的函數(shù)

同時通過閉包向外暴露了一個 cancel 函數(shù)恐锣,使得外部能直接清除內部的計數(shù)器

18. 函數(shù)節(jié)流

和函數(shù)防抖類似,區(qū)別在于內部額外使用了時間戳作為判斷矢赁,在一段時間內沒有觸發(fā)事件才允許下次事件觸發(fā)

19. 圖片懶加載

getBoundClientRect 的實現(xiàn)方式,監(jiān)聽 scroll 事件(建議給監(jiān)聽事件添加節(jié)流),圖片加載完會從 img 標簽組成的 DOM 列表中刪除褒纲,最后所有的圖片加載完畢后需要解綁監(jiān)聽事件

intersectionObserver 的實現(xiàn)方式彻秆,實例化一個 IntersectionObserver 扎附,并使其觀察所有 img 標簽

當 img 標簽進入可視區(qū)域時會執(zhí)行實例化時的回調,同時給回調傳入一個 entries 參數(shù),保存著實例觀察的所有元素的一些狀態(tài),比如每個元素的邊界信息,當前元素對應的 DOM 節(jié)點唇跨,當前元素進入可視區(qū)域的比率玉控,每當一個元素進入可視區(qū)域筏餐,將真正的圖片賦值給當前 img 標簽惠呼,同時解除對其的觀察

20. new 關鍵字

21. 實現(xiàn) Object.assign

Object.assign 的原理可以參考我另外一篇博客

22. instanceof

原理是遞歸遍歷 right 參數(shù)的原型鏈,每次和 left 參數(shù)作比較著洼,遍歷到原型鏈終點時則返回 false身笤,找到則返回 true

23. 私有變量的實現(xiàn)

使用 Proxy 代理所有含有_開頭的變量适刀,使其不可被外部訪問

通過閉包的形式保存私有變量待侵,缺點在于類的所有實例訪問的都是同一個私有變量

另一種閉包的實現(xiàn),解決了上面那種閉包的缺點,每個實例都有各自的私有變量贮泞,缺點是舍棄了 class 語法的簡潔性狡恬,將所有的特權方法(訪問私有變量的方法)都保存在構造函數(shù)中

通過 WeakMap 和閉包虱咧,在每次實例化時保存當前實例和所有私有變量組成的對象豺总,外部無法訪問閉包中的 WeakMap慷丽,使用 WeakMap 好處在于不需要擔心內存溢出的問題

24. 洗牌算法

早前的 chrome 對于元素小于 10 的數(shù)組會采用插入排序珊膜,這會導致對數(shù)組進行的亂序并不是真正的亂序塑陵,即使最新的版本 chrome 采用了原地算法使得排序變成了一個穩(wěn)定的算法,對于亂序的問題仍沒有解決

通過洗牌算法可以達到真正的亂序,洗牌算法分為原地和非原地毯盈,圖一是原地的洗牌算法宋欺,不需要聲明額外的數(shù)組從而更加節(jié)約內存占用率吠式,原理是依次遍歷數(shù)組的元素懊纳,將當前元素和之后的所有元素中隨機選取一個龟糕,進行交換

25. 單例模式

通過 ES6 的 Proxy 攔截構造函數(shù)的執(zhí)行方法來實現(xiàn)的單例模式

26. promisify

使用方法:

promisify 函數(shù)是將回調函數(shù)變?yōu)?promise 的輔助函數(shù),適合 error-first 風格(nodejs)的回調函數(shù)坛悉,原理是給 error-first 風格的回調無論成功或者失敗,在執(zhí)行完畢后都會執(zhí)行最后一個回調函數(shù)焦影,我們需要做的就是讓這個回調函數(shù)控制 promise 的狀態(tài)即可

這里還是用了 Proxy 代理了整個 fs 模塊废岂,攔截 get 方法藏姐,使得不需要手動給 fs 模塊所有的方法都包裹一層 promisify 函數(shù),更加的靈活

27. 優(yōu)雅的處理 async/await

使用方法:

無需每次使用 async/await 都包裹一層 try/catch 灯变,更加的優(yōu)雅添祸,這里提供另外一個思路曹体,如果使用了 webpack 可以編寫一個 loader,分析 AST 語法樹护蝶,遇到 await 語法姨涡,自動注入 try/catch衩藤,這樣連輔助函數(shù)都不需要使用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涛漂,隨后出現(xiàn)的幾起案子赏表,更是在濱河造成了極大的恐慌,老刑警劉巖匈仗,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓢剿,死亡現(xiàn)場離奇詭異,居然都是意外死亡悠轩,警方通過查閱死者的電腦和手機间狂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來火架,“玉大人鉴象,你說我怎么就攤上這事忙菠。” “怎么了纺弊?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵牛欢,是天一觀的道長。 經常有香客問我淆游,道長傍睹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任稽犁,我火速辦了婚禮焰望,結果婚禮上骚亿,老公的妹妹穿的比我還像新娘已亥。我一直安慰自己,他們只是感情好来屠,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布虑椎。 她就那樣靜靜地躺著,像睡著了一般俱笛。 火紅的嫁衣襯著肌膚如雪捆姜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天迎膜,我揣著相機與錄音泥技,去河邊找鬼。 笑死磕仅,一個胖子當著我的面吹牛珊豹,可吹牛的內容都是我干的。 我是一名探鬼主播榕订,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼店茶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劫恒?” 一聲冷哼從身側響起贩幻,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎两嘴,沒想到半個月后丛楚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡憔辫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年趣些,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螺垢。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡喧务,死狀恐怖赖歌,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情功茴,我是刑警寧澤滑沧,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站对妄,受9級特大地震影響剪芍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜玲昧,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一栖茉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孵延,春花似錦吕漂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至犬钢,卻和暖如春苍鲜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玷犹。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工混滔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歹颓。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓坯屿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晴股。 傳聞我的和親對象是個殘疾皇子愿伴,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容