前面我們已經(jīng)講過了乙漓,JavaScript是函數(shù)式編程語言级历,支持高階函數(shù)和閉包。函數(shù)式編程非常強(qiáng)大簇秒,可以寫出非常簡潔的代碼鱼喉。例如Array
的map()
和filter()
方法:
'use strict';
var a1 = [1, 4, 9, 16];
var a2 = a1.map(Math.sqrt); // [1, 2, 3, 4]
var a3 = a2.filter((x) => {return x % 2 === 0; }); // [2, 4]
現(xiàn)在問題來了,Array
有map()
和filter()
方法趋观,可是Object沒有這些方法扛禽。此外,低版本的瀏覽器例如IE6~8也沒有這些方法皱坛,怎么辦编曼?
方法一,自己把這些方法添加到Array.prototype
中剩辟,然后給Object.prototype
也加上mapObject()
等類似的方法掐场。
方法二,直接招一個(gè)成熟可靠的第三方開源庫贩猎,使用統(tǒng)一的函數(shù)來實(shí)現(xiàn)map()
熊户、filter()
這些操作。
現(xiàn)在我們采用方法二吭服,選擇的第三方庫就是underscore嚷堡。
正如jQuery統(tǒng)一了不同瀏覽器之間的DOM操作和差異,讓我們可以簡單的對(duì)DOM進(jìn)行操作艇棕,underscore則提供了一套完善的函數(shù)式編程的接口蝌戒,讓我們更方便地在JavaScript中實(shí)現(xiàn)函數(shù)式編程。
jQuery在加載時(shí)沼琉,會(huì)把自身綁定在唯一的全局變量$
上北苟,underscore與其類似,會(huì)把自身綁定到唯一的全局變量_
打瘪,這也是為啥它的名字叫做underscore的原因友鼻。
用underscore實(shí)現(xiàn)map()
操作如下:
'use strict'
_.map([1, 2, 3], (x) => x*x); // [1, 4, 9]
咋一看比直接用Array.map()
要麻煩一點(diǎn),可是underscore的map()
還可以作用于Object:
'use strict';
_.map([ a:1, b:2, c:3], (v, k) => k += '=' +v); // ['a=1', 'b=2', 'c=3']