整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Javascript中的數組遍歷方法以及兼容性處理,

          Javascript中的數組遍歷方法以及兼容性處理,你都掌握了嗎?


          隨著ES6中新增對數組的find方法,對于數組的遍歷已經有越來越多的方法可以選擇,我們完全可以拋棄古老的for方法。今天這篇文章我們就一起來看看在Javascript中都可以使用哪些方法來遍歷一個數組吧,同時提供一些兼容性的處理。

          本篇文章中的代碼已經開源到Github上,感興趣的可以自取,Github地址為:

          https://github.com/zhouxiongking/article-pages/blob/master/articles/arrayTraverse/arrayTraverse.js

          Javascript

          forEach

          forEach是數組遍歷使用最為頻繁的一個方法,它的作用是使用定義的函數處理數組中的每個元素。

          首先我們來看看forEach的基本使用方法。

          forEach基本使用

          forEach中定義的回調函數接收三個參數,分別是當前元素值,當前元素索引,當前數組。

          實際上forEach方法接收第二個參數,如果傳入這個參數,則回調函數中的this就指向這個參數值,如果沒有傳入,則this指向全局變量window。通過下面的代碼可以很容易看清楚。

          傳入第二個參數

          這里我們提供一個兼容性處理的方案。

          forEach兼容性處理

          map

          map方法會將數組中每個元素做處理得到新的元素,然后返回這些新的元素組成的數組。其回調函數中接收的參數和forEach一樣,其基本使用如下。

          map基本使用

          需要注意的一點是,在map的回調函數中需要有return返回值,如果沒有返回值,得到的結果會是由undefined組成的數組。

          必須有返回值

          這里提供一下兼容性處理。

          map兼容性處理

          filter

          filter顧名思義,過濾數組中滿足條件的數值,得到一個新的數組。在filter的回調函數中需要返回true或者false,true代表滿足條件,通過篩選;false代表不滿足條件,不通過篩選。

          filter基本使用方法

          這里提供一下兼容性處理。

          filter兼容性處理

          some與every

          some方法與every方法在使用上有很多相似之處。some方法的作用是只要數組中某個元素滿足條件就返回true;而every方法作用是數組中每個元素都要滿足條件才返回true

          它們的測試結果如下所示。

          some與every

          some與every方法的兼容性處理也很類似,一個是對true值的判斷,一個是對false值的判斷。對some方法的兼容性處理如下。

          some方法兼容性處理

          every方法兼容性處理如下。

          every兼容性處理

          reduce

          reduce方法作用是使用可能提供的初始值來處理數組中的每個元素,每輪計算都會有一個返回值進入下一輪計算,得到一個最終的返回值。

          reduce在是否接收初始值上會對結果有很大的影響。在不接收初始值的情況下,會將第一個值作為初始值,索引是從第二個值開始計算。通過下面的代碼可以很容易看出來。

          reduce不接收初始值

          當reduce接收初始值時,索引是從數組第一個值開始。

          reduce接收初始值

          這里提供對reduce方法的兼容性處理。

          reduce方法兼容性處理

          find

          find方法是ES6新增的方法,其作用是返回數組中第一個滿足條件的值,如果都不滿足條件則返回undefined。其基本使用方法如下所示。

          find基本使用

          這里提供一下兼容性處理。

          find兼容性處理

          結束語

          今天這篇文章主要總結了下Javascript中對數組進行遍歷的一些方法,以及對低級瀏覽器提供了一些兼容性處理,你學會了嗎?

          見使用的遍歷函數

          使用for-of循環(ES2015+) - 異步友好

          使用forEach/some - 異步不友好(見例子)

          使用for - 異步友好


          幾點注意

          不使用map,除非你用不到循環的返回值,請注意map和forEach是有區別的,map主要用來生成一個新的數組。

          異步謹慎使用forEach,如果回調做異步工作,需要forEach等待(但是forEach不會等待,而是直接到底)。


          數組遍歷例子

          for-of (ES2015+)

          用法簡單直接,使用let把單個變量的范圍進行限制,不會影響到循環外,而且性能優于forEach,建議遍歷數組使用該函數。

          const a=["a", "b", "c"];
          for (let val of a) {
              console.log(val);
          }
          //依次打印結果 "a", "b", "c"

          同時也對異步處理十分友好。

          //延時
          function delay(ms) {
            return new Promise((resolve)=> {
              setTimeout(resolve, ms);
            });
          }
          
          //異步函數打印數組內容
          async function show(arr) {
            for (let item of arr) {
              await delay(400); //等待 forEach 則會無視 await
              console.log(item);
            }
          }
          
          show(["頭", "條", "新", "浪", "潮"]);
          //依次延時打印結果 "頭"  "條"  "新"  "浪"  "潮"

          forEach (ES5)

          處理同步代碼(不需要等待),則可以使用forEach用于在循環期間完成的異步進程。

          const a=["a", "b", "c"];
          a.forEach((val)=> {
              console.log(val);
          });
          //依次打印結果 "a", "b", "c"

          異步處理例子

          組和對象一樣都是引用數據類型,數組中的數據按照順序排列,從0開始,把這個叫做索引,也叫做下標,把數組中的每個數據叫做元素,或者簡稱元 。

          數組的新建方式有字面量創建和構造函數創建兩種方法

          字面量創建: var arr=[4,5,3,6,2,1]

          構造函數創建: var arr1=new Array(4,5,3,6,2,1);

          注:如果通過數組的構造函數創建數組,參數僅有1個,且這個參數是正整數,則表示新建一個具備該正整數長度的空數組,里面有這個長度的若干空元素 。

          一、for循環方法遍歷數組

          var arr=["d","e","f","a"];
          for(var i=0;i<arr.length;i++){
              console.log(arr[i]);
           }

          二、for...in循環遍歷

          var arr=["d","e","f","a"];
          for (var i in arr){
                console.log(arr[i]);
           }

          使用for循環與for...in循環遍歷數組區別

          1、當使用for in遍歷時,會將所有屬性包括下標都會轉為字符型

          2、for in不會遍歷空元素,for會遍歷空元素

          3、for in可以遍歷到數組的屬性,for只能遍歷數組所有下標,不能遍歷屬性

          可以使用for...in的特性實現數組的不遍歷空元素方法

          for(var i=0;i<arr.length;i++){
                    if(i in arr)console.log(arr[i]);
           } 

          三、forEach方法(不會遍歷空元素)

          格式:arr.forEach(function(元素,下標,數組) {} )

          var arr=[1,2,3,4,5,,7,8,9];
          arr.forEach(function(item,index,arr){
                console.log(item);
          })

          四、map方法

          格式: arr.map(function(元素,下標,數組) {} )

          var arr=[1,2,3,4,5,,7,8,9];
          arr.map(function(item,index,arr){
                console.log(item);
          })

          forEach與map方法區別

          1、 forEach方法不會遍歷空元素

          2、forEach方法沒有返回值

          3、map返回值默認是一個與arr同等長度的數組,且數組內元素都是Undefined.結果演示如下:

          var arr=[1,2,3,4,5,,7,8,9];
          var arr1=arr.map(function(item,index,arr){
          })
          console.log(arr1);

          運行結果


          主站蜘蛛池模板: 亚洲AV无码一区二区二三区入口| 美女免费视频一区二区三区| 91在线精品亚洲一区二区| 亚洲欧美日韩中文字幕在线一区| AV怡红院一区二区三区| 亚洲av色香蕉一区二区三区| 国产在线无码视频一区二区三区| 一区二区三区内射美女毛片| 亚洲av成人一区二区三区| 另类一区二区三区| 国产一区在线视频| 免费在线观看一区| 国产一区二区三区内射高清| 国产精品成人免费一区二区 | 亚洲熟妇av一区二区三区下载| 精品人妻少妇一区二区三区| 老鸭窝毛片一区二区三区| 日韩精品人妻一区二区三区四区| 亚洲一区动漫卡通在线播放| 人妻少妇久久中文字幕一区二区| 久久精品视频一区二区三区| 中文字幕人妻无码一区二区三区| 成人一区二区免费视频| 在线精品国产一区二区三区 | 免费无码A片一区二三区| 日本内射精品一区二区视频 | 久久中文字幕一区二区| 国产乱码精品一区二区三区中文 | 成人国产精品一区二区网站公司 | 丝袜无码一区二区三区| 熟女大屁股白浆一区二区| 中文字幕一区二区三区四区 | 久久久久人妻一区二区三区vr| 久久精品免费一区二区三区| 亚洲AV日韩AV天堂一区二区三区| 精品无码人妻一区二区三区| 亚洲AV香蕉一区区二区三区| 午夜视频一区二区| 国产一区二区三区高清视频| 文中字幕一区二区三区视频播放| 亚洲AV无码一区二区三区在线|