下劃線是個js底層小類庫,主要是為彌補js基礎部分的不足.提供了一些集合,物件,函式,及其它的一些支援.實際上應該把它當成js的一部分來看.考慮到它短小精悍,應該直接看**及相關英文文件.
學習它一是為了加強一下js,學以致用,二是加強一下函式式程式設計的實戰,考慮到它實在是太短小,雖然英文比較爛但還是直接看原文文件,並根據學習理解意譯下來.
下線線是什麼?是_, 也就是underscore.js這個庫,js的變是名可以有兩個特殊符號就是$和_,可見這兩個符號,的確是被重要的庫給占領了.這就是占領制高點,另乙個$不用說都知道是什麼了.當然還有個bb(backbone),因為沒有占領制高點,類似的庫就比較多了.
下劃線怎麼看怎麼象下劃錢,讀同來就是瞎花錢,$也是錢錢,難道說這就是巧合?可見_和$就是賺錢的工具.以下就下劃線就都用_代替.
_是個很小的js庫,主要提供象prototype.js, ruby等類似功能,但不需要擴充套件js語言本身.而且它主要用於$及bb(backbone)的支援._大約有80多個函式,以支援常用的map, select, invoke及其它一些常用功能,而這些大多數的以後瀏覽器可以原生支援,那麼它可以提供乙個瀏覽器的包裝,可見現在就使用_,在未來也不會有問題._還經過完整全面的測試,可以放心使用.順便補充下,**是
迭代: each 迭代器,別名foreach
語法 _each(list, iterator, [context]) 如果list是陣列,則iterator引數是(element, index, list), 如果list是物件,則iterator引數是(value, key, list)
示例: _.each(, function (value, key) );
本人注意到乙個共性,就是_的很多呼叫方式都是這樣子(list, iterator, [context]),別小看這三個引數,這裡面包含了很深刻的思想.根據可見資料看出,大多數人無法很好的理解這些庫就是因為不理解函式式程式設計,以及物件導向的一些底層原理.只會用一些皮毛,而無法使用其精髓.
看到這裡,就發現學習_學對了,果然是精妙.
首先,大多數操作就是高階函式,就是函式式程式設計的乙個最廣泛應用.each(list, iterator),就是傳統的for(***) 的昇華.把迴圈和操作給解耦.
其次,那個[context]引起了我的注意.看上去很高深的樣子,經過google後,原來是呼叫了call,而call是什麼?
就是呼叫方法時換掉物件環境,相當於面象物件的虛方法.但實際上更巧妙.原因是物件導向不能這麼用.強型別啊.
這樣,其實就變成了三個的組合,道生一,乙個函式介面比如each, 一生二,高階函式each(list, iterator),二生三,(list, iterator,[context]), 三生萬物.這三個組合,可以千變萬化.可見中國人有多聰明,早在2023年前就明白這些道理.可惜中國傳統文化,被錯誤的政治課本代替了.他們告訴我那些課本上的東西是對的,是真理,但是本人就是聽不懂,也無法用邏輯去推理出來,只能被動接受,你說是對的那就是對的吧.但是涉及到程式設計,還是得使用其它的知識.
然後順便再提下,$, 這個也是符合道的思想的東西.$為一,$(集合)為二,$(集合).操作為三,然後就千變萬化了,其實和_是一樣一樣的,只不過寫法略有不同.我們對比一下
[context].$(list).iterator 注意[context]這個上下文環境是可以遞迴的.這就分形的自相似性.
_.(list, iterator, [context]) 注意,所有的引數都是可以遞迴的,這就是分形的自相似性,但是_明顯靈活性更高.而$的iterator受限了.你不能通過函式式的方法去用它,可見$是乙個函式式應用的例項,它是個工具,庫,框架,而_是真正的函式式,是個規則.
搞清楚了基本概念,再往下就容易多了.
對映:map_.map(list, iterator, [context])
alias:collect
化簡:reduce_.reduce(list, iterator, memo, [context])
aliases:inject, foldl
var sum = _.reduce([1, 2, 3], function(memo, num), 0); //注意這裡的memo其實就是個初始化值,觀察原**,memo是不可以省略的.查詢:find=> 6
reduceright 略過
_.find(list, iterator, [context])
alias:detect//只返回符合條件的第乙個,相當於singleordefault
過濾:filter_.filter(list, iterator, [context])
alias:select//返回符合條件的集合
條件:where_.where(list, properties)
這裡where的條件變了,用我們已有的常識來推理下,where需要多種條件組合,我們自已可能這麼幹,定義乙個查詢條件表示式,查詢是key, value, 比較符,連線符.比如:
實際上_的where沒那麼複雜,就是把包含key,value的properties的結果返回乙個集合.其實就是只有"等於","和" 兩種預設比較符,我們看下**是否如此.
恩,**暴露了一切,_沒有想象那麼複雜,這裡是前端,輕量級的,沒有後端大量的複雜業務邏輯,也沒有大量的條件,異常判斷什麼的,也沒有過載符,所以where是相當於過載了filter.
單結果條件:findwhere_.findwhere(list, properties) 相當於過載了find
拒絕(拋棄):reject_.reject(list, iterator, [context]) 相當於filter取反
下面三個都是邏輯運算,返回值是true或false, 相當於 and or in
全部:every_.every(list, iterator, [context])
alias:all
部分:some_.some(list, [iterator], [context])
alias:any
包含:contains_.contains(list, value)
alias:include
Python單下劃線和雙下劃線
python 用下劃線作為變數字首和字尾指定特殊變數。不能用 from moduleimport 匯入 系統定義名字 類中的私有變數名 核心風格 避免用下劃線作為變數名的開始。因為下劃線對直譯器有特殊的意義,而且是內建識別符號所使用的符號,我們建議程式設計師避免用下 劃線作為變數名的開始。一般來講,...
python的單下劃線和雙下劃線
python 類中的單下劃線開頭的變數表示 該方法為類的私有方法,原則上外部不能訪問,但是用.xx是可以訪問到的 雙下劃線開頭則是強制外部不能直接訪問的用.xx是訪問不到的,它內部其實是將變數名重新命名為 類名 變數名,所以可以通過.類名 變數名訪問 coding utf 8 author linh...
美化下劃線
在css中,眾所周知使用text decoration underline 可以為任何文字新增下劃線的效果。不過我們一般都在初始化裡把a標籤的下劃線去掉 text decoration none 有沒有想過美化這些下滑下劃線呢 理想的場景中,強調使用下劃線,它應該做到以下幾點 這些要求並不為過,都是...