最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺析JS的數(shù)組遍歷方法(推薦)

 更新時間:2016年06月15日 17:15:53   作者:漁歌  
這篇文章主要介紹了深入淺析JS的數(shù)組遍歷方法(推薦)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

用過Underscore的朋友都知道,它對數(shù)組(集合)的遍歷有著非常完善的API可以調(diào)用的,_.each()就是其中一個。下面就是一個簡單的例子:

var arr = [1, 2, 3, 4, 5];
_.each(arr, function(el) {
console.log(el);
}); 

上面的代碼會依次輸出1, 2, 3, 4, 5,是不是很有意思,遍歷一個數(shù)組連for循環(huán)都不用自己寫了。_.each()方法遍歷數(shù)組非常好用,但是它的內(nèi)部實現(xiàn)一點(diǎn)都不難。下面就一起來看看到底是如何實現(xiàn)_.each()的。在這之前,我們先來看看_.each()的API。_.each()的一般是如下調(diào)用的:

_.each(arr, fn, context);

它接收3個參數(shù),

第一個是需要遍歷的數(shù)組(其實是對象也是可以的,這個后面我們再一起來討論);

第二個是它的回調(diào)函數(shù)(這個回調(diào)函數(shù)可以傳入3個參數(shù),如:function(el, i, arr),分別是當(dāng)前元素、當(dāng)前索引和原數(shù)組);

第三個是回調(diào)函數(shù)需要綁定到的上下文,即指定回調(diào)函數(shù)fn的this值。

好啦,需求已經(jīng)非常明確了,開始干活啦!

我們先來實現(xiàn)一個最簡單的_.each(),它不能夠修改上下文this的,接收兩個參數(shù),代碼如下:

var _ = {}; // 假設(shè)這就是underscore哈
// 一個最簡單的_.each方法的實現(xiàn)
_.each = function(arr, fn) {
  for(var i = 0; i < arr.length; i++) {
    fn(arr[i], i, arr);
  }
  return arr; // 把原數(shù)組返回
} 

怎么樣?是不是很簡單呢?只是用一個for循環(huán),不停的調(diào)用回調(diào)函數(shù)即可,短短幾行代碼就搞定了,相信沒有朋友看不懂的哈!下面我們來測試一下看能不能正常工作:

var arr = [1, 2, 3, 4, 5];
_.each(arr, function(el, i, arr) {
  console.log(el);
}); 

在瀏覽器打開,然后控制臺就會看到有正確的輸出了。

這么簡單的代碼一點(diǎn)意思也沒有,接下來看一個比較有點(diǎn)挑戰(zhàn)性的例子哈。比如,數(shù)組arr有個sum屬性,我們需要把數(shù)組所有的元素求和之后存放到sum里面,如下:

var arr = [1, 2, 3, 4, 5];
arr.sum = 0; // sum屬性用來存放數(shù)組元素之和
_.each(arr, function(el, i, arr) {
  this.sum += el;
}); 

這時候,回調(diào)函數(shù)里面用到了this,如果不綁定的話,this默認(rèn)就是window,這不是我們想要的,我們希望它綁定到數(shù)組arr上面。call或者apply可以實現(xiàn)這個功能,代碼如下:

var _ = {}; // 假設(shè)這就是underscore哈
// bind,接收兩個參數(shù)fn和context
// 把fn綁定到context上面
var bind = function(fn, context) {
  context = context || null;
  return function(el, i, arr) {
    fn.call(context, el, i, arr);
  }
}
// _.each
_.each = function(arr, fn, context) {
  // 調(diào)用bind方法,把fn綁定到context上面
  fn = bind(fn, context);
  for(var i = 0; i < arr.length; i++) {
    fn(arr[i], i, arr);
  }
  return arr;
}
// 測試用例:
var arr = [1, 2, 3, 4, 5];
arr.sum = 0; // sum屬性用來存放數(shù)組元素之和
_.each(arr, function(el, i, arr) {
  this.sum += el;
}, arr);
console.log(arr.sum); // 15 

好啦,這個_.each()已經(jīng)足夠強(qiáng)大了,可以正常遍歷數(shù)組,還可以任意指定this值改變回調(diào)函數(shù)的上下文。但是,我們前面有提到過,Underscore的_.each()還可以遍歷對象的 ,這個實現(xiàn)也不難,只要判斷一下傳入的第一個參數(shù)是對象還是數(shù)組,如果是數(shù)組就像我們一樣遍歷,否則如果是對象,使用對象的for...in循環(huán)遍歷就行了。有興趣的可以自己試試,或者看看underscore的源碼。

注意:自從ES5標(biāo)準(zhǔn)以來,原生數(shù)組就已經(jīng)具有了Array.prototype.forEach、Array.prototype.Map等遍歷方法了,在項目中可以使用原生的。

以上所述是小編給大家介紹的深入淺析JS的數(shù)組遍歷方法(推薦)的全部敘述,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • javascript中數(shù)組方法匯總

    javascript中數(shù)組方法匯總

    本文給大家詳細(xì)匯總了一下javascript中的數(shù)組方法,十分的全面細(xì)致,有需要的小伙伴可以參考下。
    2015-07-07
  • 詳解vue-cli+es6引入es5寫的js(兩種方法)

    詳解vue-cli+es6引入es5寫的js(兩種方法)

    本文通過兩種方法給大家介紹vue-cli+es6引入es5寫的js,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-04-04
  • JavaScript事件監(jiān)聽器addEventListener()方法和一些基本事件詳解

    JavaScript事件監(jiān)聽器addEventListener()方法和一些基本事件詳解

    這篇文章主要介紹了JavaScript事件監(jiān)聽器addEventListener()方法和一些基本事件,這篇文章主要介紹了JavaScript事件監(jiān)聽器addEventListener()方法和一些基本事件的相關(guān)資料,需要的朋友可以參考下
    2024-10-10
  • 淺談JS三座大山之異步和單線程

    淺談JS三座大山之異步和單線程

    首先我們要知道,js這門語言是單線程的,同時只能做一件事,比如說渲染dom,執(zhí)行js方法,這些事情只能一個一個做,不能分開執(zhí)行。(因為js需要操作dom,當(dāng)兩個js方法同時操作一個dom的時候就會出問題,所以js被設(shè)計成了單線程)。本文將介紹JS三座大山之異步和單線程。
    2021-06-06
  • JavaScript如何監(jiān)測數(shù)組的變化

    JavaScript如何監(jiān)測數(shù)組的變化

    最近在造輪子的時候遇到了這么一個問題,那就是數(shù)組在調(diào)用內(nèi)部方法的時候怎么才可以監(jiān)聽到數(shù)組發(fā)生了變化,這篇文章主要給大家介紹了關(guān)于JavaScript如何監(jiān)測數(shù)組變化的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • JavaScript中的Proxy-Reflect操作方法

    JavaScript中的Proxy-Reflect操作方法

    這篇文章主要介紹了JavaScript中的Proxy-Reflect操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • js封裝成插件_Canvas統(tǒng)計圖插件編寫實例

    js封裝成插件_Canvas統(tǒng)計圖插件編寫實例

    下面小編就為大家?guī)硪黄猨s封裝成插件_Canvas統(tǒng)計圖插件編寫實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • JavaScript取得鍵盤按下方向鍵是哪個的方法

    JavaScript取得鍵盤按下方向鍵是哪個的方法

    這篇文章主要介紹了JavaScript取得鍵盤按下方向鍵是哪個的方法,涉及javascript針對鍵盤按鍵事件的判定技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 微信小程序-小說閱讀小程序?qū)嵗╠emo)

    微信小程序-小說閱讀小程序?qū)嵗╠emo)

    本篇文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • jQuery檢測輸入的字符串包含的中英文的數(shù)量

    jQuery檢測輸入的字符串包含的中英文的數(shù)量

    這篇文章主要介紹了jQuery檢測輸入的字符串包含的中英文的數(shù)量的實現(xiàn)方法,非常的實用,這里推薦給小伙伴,有需要的朋友可以參考下。
    2015-04-04

最新評論

莆田市| 佛山市| 顺义区| 聂荣县| 阳山县| 南康市| 中江县| 济南市| 辛集市| 永州市| 庄河市| 阿拉善右旗| 独山县| 桦川县| 阿瓦提县| 襄垣县| 双桥区| 泰来县| 南雄市| 湛江市| 应城市| 库伦旗| 开平市| 呼图壁县| 平邑县| 淮北市| 潼关县| 九台市| 北川| 万安县| 银川市| 裕民县| 宽甸| 文安县| 溧水县| 镇江市| 琼海市| 泸定县| 太湖县| 芒康县| 海伦市|