亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Underscore源碼分析

2019-11-20 10:53:44
字體:
來源:轉載
供稿:網友

幾年前就有人說javascript是最被低估一種編程語言,自從nodejs出來后,全端(All Stack/Full Stack)概念日漸興起,現在恐怕沒人再敢低估它了。javascrip是一種類C的語言,有C語言基礎就能大體理解javascript的代碼,但是作為一種腳本語言,javascript的靈活性是C所遠遠不及的,這也會造成學習上的一些困難。

一、集合

 1.首先是幾個迭代的方法。

_.each = _.forEach = function(obj, iteratee, context) {iteratee = optimizeCb(iteratee, context);var i, length;if (isArrayLike(obj)) { for (i = 0, length = obj.length; i < length; i++) {  iteratee(obj[i], i, obj); }} else { var keys = _.keys(obj); for (i = 0, length = keys.length; i < length; i++) {  iteratee(obj[keys[i]], keys[i], obj); }}// 鏈式調用return obj; }; 

ES為數組同樣添加了原生的forEach()方法。不同的是這里的each(forEach)方法可以對所有集合使用,函數接受三個參數(集合、迭代函數、執行環境)。

optimizeCb函數根據迭代函數參數個數的不同為不同的迭代方法綁定了相應的執行環境,forEach迭代函數同樣接受三個參數(值,索引,集合)。

接下來就是for循環調用迭代函數了。 

_.map中一種更優雅的判斷isArrayLike的實現方式:(只用一個for循環)

var keys = !isArrayLike(obj) && _.keys(obj),    length = (keys || obj).length,    results = Array(length);  for (var index = 0; index < length; index++) {   var currentKey = keys ? keys[index] : index;   results[index] = iteratee(obj[currentKey], currentKey, obj);  }  return results;  // 合理使用&&、||、?:可以大大減少代碼量 

還有兩個特別的地方:

•將集合分成了類數組集合和對象集合。使用了isArrayLike函數:

// js的最大精確整數 var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; var isArrayLike = function(collection) {var length = collection != null && collection.length;return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; }; // 如果集合有Length屬性且為數字并且大于0小于最大的精確整數,則判定是類數組

 •使用了_.keys函數,Object同樣有原生的keys函數,用于返回一個集合obj可被枚舉的屬性數組。實現比較簡單,for in加上hasOwnProperty()方法。

--------------------------------------------------------------------------------

_.map,_.reduce方法原理類似.

 _.find函數和Array.some()類似,不同的是返回的是第一個使迭代結果為真的那個元素,而不是Array.some()那樣返回布爾值。

 _.find = _.detect = function(obj, predicate, context) {  var key;  if (isArrayLike(obj)) {   key = _.findIndex(obj, predicate, context);  } else {   key = _.findKey(obj, predicate, context);  }  if (key !== void 0 && key !== -1) return obj[key]; };function createIndexFinder(dir) {  return function(array, predicate, context) {   predicate = cb(predicate, context);   var length = array != null && array.length;   // 如果dir為1,index為0,index+=1,index正序循環   // 如果dir 為-1,index為length-1,index += -1反序循環   // 判斷循環條件則用了index >= 0 && index < length方法兼顧兩種循環方式   var index = dir > 0 ? 0 : length - 1;   for (; index >= 0 && index < length; index += dir) {    if (predicate(array[index], index, array)) return index;   }   return -1;  }; } _.findIndex = createIndexFinder(1); _.findLastIndex = createIndexFinder(-1); 

值得借鑒的地方是這里的一個for循環能夠根據傳入的參數不同配置不同的循環順序。

 1.集合中的其他方法基本都是基于迭代方法來實現的。

_.max = function(obj, iteratee, context) {var result = -Infinity, lastComputed = -Infinity,  value, computed;if (iteratee == null && obj != null) { obj = isArrayLike(obj) ? obj : _.values(obj); for (var i = 0, length = obj.length; i < length; i++) {  value = obj[i];  if (value > result) {   result = value;  } }} else { iteratee = cb(iteratee, context); _.each(obj, function(value, index, list) {  computed = iteratee(value, index, list);  if (computed > lastComputed || computed === -Infinity && result === -Infinity) {   result = value;   lastComputed = computed;  } });}return result; }; 

  max方法用于尋找集合中的最大值,通過循環list中的所有項,然后比較當前項和結果項,如果當前項大于結果,則將其賦給結果項,最后返回結果項。

 2.集合轉換為數組

 _.toArray = function(obj) {    if (!obj) return [];    // 如果是數組,采用了Array.prototype.slice.call(this,obj)這種方法    if (_.isArray(obj)) return slice.call(obj);    // 類數組對象,這里沒有采用Slice方法,而是利用.map對集合進行迭代,從而返回一個數組。 _.identity該方法傳入的值和返回的值相等。(主要用于迭代)    if (isArrayLike(obj)) return _.map(obj, _.identity);    // 普通對象,則返回由屬性值組成的數組。    return _.values(obj);   };

數據類型

STL需要對vector、list等進行區分是因為不同的數據結構需要或者可以進行不同的實現,但underscore里面Collections和Arrays分開是什么道理呢?這也要從javascript的數據類型說起,看下圖。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av手机在线| 日韩中文在线中文网在线观看| 欧美噜噜久久久xxx| 97香蕉超级碰碰久久免费的优势| 伊人成人开心激情综合网| 国产成人精品一区二区在线| 亚洲丁香婷深爱综合| 2021久久精品国产99国产精品| 精品亚洲一区二区| 国产欧亚日韩视频| 亚洲视频网站在线观看| 国产婷婷成人久久av免费高清| 精品美女永久免费视频| 日韩va亚洲va欧洲va国产| 欧美激情一区二区三区久久久| 91在线高清免费观看| 国产日韩在线看| 亚洲欧美国产va在线影院| 国产欧美日韩免费| 精品久久久久久久久久ntr影视| 日韩av在线免费| 国产精品福利在线观看| 久久av红桃一区二区小说| 亚洲欧美国产精品va在线观看| 黑人巨大精品欧美一区二区一视频| 最近中文字幕mv在线一区二区三区四区| 国产精品网站视频| 91精品国产自产在线| 欧美日韩国产精品一区| 91免费精品国偷自产在线| 亚洲国产女人aaa毛片在线| 国产日韩在线视频| 亚洲a区在线视频| 亚洲午夜女主播在线直播| 欧美性xxxxxxxxx| 色偷偷亚洲男人天堂| 国产精品6699| 国产精品欧美日韩| 5278欧美一区二区三区| 国产亚洲aⅴaaaaaa毛片| 日韩国产高清污视频在线观看| 91av视频在线播放| 亚洲欧美国产另类| 在线观看国产精品91| 成人午夜激情免费视频| 性欧美xxxx交| 精品少妇v888av| 亚洲欧洲激情在线| 亚洲男人天堂2024| 国产一区视频在线| 亚洲国产欧美一区二区三区同亚洲| 红桃视频成人在线观看| 免费av一区二区| 欧美一区二区三区免费观看| 久久精品国产电影| 亚洲午夜久久久久久久| 欧美国产日韩视频| www.日韩av.com| 国内免费精品永久在线视频| 欧美xxxx18国产| 欧美日韩一区二区精品| 久久国产精品久久国产精品| 国产69精品99久久久久久宅男| 91精品国产高清自在线| 亚洲一区二区久久久久久久| 国产精品欧美日韩| 国产一区二区三区18| 日韩性生活视频| 国产精品美女主播在线观看纯欲| 色综合久久久久久中文网| 国产精品国产三级国产专播精品人| 欧洲永久精品大片ww免费漫画| 国产精品一区二区性色av| 久久久国产精品免费| 国产精品久久久久久av| 欧美黄色片免费观看| 亚洲精品少妇网址| 久久久日本电影| 日本欧美一二三区| 97成人精品视频在线观看| 亚洲综合在线做性| 国产精品爱啪在线线免费观看| 久久视频在线视频| 亚洲国产精品va在线观看黑人| 欧美激情二区三区| 中文字幕日韩免费视频| 亚洲视频在线观看| 国产精品久久久久久久久久免费| 亚洲第一福利视频| 欧美丝袜美女中出在线| 欧美国产日韩在线| 亚洲国产私拍精品国模在线观看| 亚洲激情国产精品| 国产精品久久在线观看| 亚洲精品99999| 亚洲人成网站色ww在线| 久久九九热免费视频| 国产成人精品av| 狠狠躁天天躁日日躁欧美| 国产成人精品免高潮费视频| 青草热久免费精品视频| 国内外成人免费激情在线视频网站| 久久免费视频这里只有精品| 国产深夜精品福利| 中文字幕国产日韩| 亚洲欧美变态国产另类| 夜夜躁日日躁狠狠久久88av| 在线观看日韩www视频免费| 91av在线免费观看| 亚洲香蕉成视频在线观看| www.亚洲人.com| 日韩av一区在线| 色一情一乱一区二区| 中文字幕日韩av电影| 色综合久久88色综合天天看泰| 欧美在线视频a| 在线观看日韩专区| 国产欧美在线看| 亚洲视频第一页| 精品国产乱码久久久久久虫虫漫画| 欧美色视频日本高清在线观看| 色综合视频网站| 欧美性理论片在线观看片免费| 精品国产区一区二区三区在线观看| 国产午夜精品全部视频在线播放| 欧美电影免费观看高清完整| 亚洲欧美日韩视频一区| 亚洲国产成人精品久久久国产成人一区| 欧美黄色成人网| 97超级碰在线看视频免费在线看| 精品国产依人香蕉在线精品| 成人综合网网址| 都市激情亚洲色图| 亚洲美女www午夜| 精品国产一区二区在线| 中文国产亚洲喷潮| 国产精品老女人视频| 国产伊人精品在线| 欧美日韩视频免费播放| 欧美日韩成人在线视频| 欧美黑人国产人伦爽爽爽| 在线观看国产成人av片| 日本成人免费在线| 日韩av一区二区在线| 亚洲片国产一区一级在线观看| 久久手机免费视频| 姬川优奈aav一区二区| 欧美成人午夜免费视在线看片| 国内久久久精品| 国产在线高清精品| 国产香蕉精品视频一区二区三区| 亚洲精品91美女久久久久久久| 精品久久香蕉国产线看观看gif| 成人精品视频久久久久| 这里只有精品在线观看| 欧美亚洲视频一区二区| 欧美在线不卡区| 亚洲欧美激情在线视频| 第一福利永久视频精品| 456亚洲影院| 日韩国产精品亚洲а∨天堂免| 欧美大片在线看| 亚洲午夜女主播在线直播| 在线亚洲男人天堂|