Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产极品麻豆91在线,视频一区国产精品,日本大片免aaa费观看视频

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          JavaScript 各種遍歷方式詳解

          JavaScript 各種遍歷方式詳解

          了方便例子講解,現(xiàn)有數(shù)組和字面量對象如下

          var demoArr=['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular'];
          var demoObj={
            aaa: 'Javascript',
            bbb: 'Gulp',
            ccc: 'CSS3',
            ddd: 'Grunt',
            eee: 'jQuery',
            fff: 'angular'
          };
          

          for

          可以直接看示例,用得太多了,很簡單

          (function () {
            for (var i=0, len=demoArr.length; i < len; i++) {
              if (i==2) {
                // return;   // 函數(shù)執(zhí)行被終止
                // break;    // 循環(huán)被終止
                continue; // 循環(huán)被跳過
              };
              console.log('demo1Arr[' + i + ']:' + demo1Arr[i]);
            }
          })();
          

          關(guān)于for循環(huán),有以下幾點(diǎn)需要注意

          • for循環(huán)中的 i 在循環(huán)結(jié)束之后任然存在于作用域中,為了避免影響作用域中的其他變量,使用函數(shù)自執(zhí)行的方式將其隔離起來()();
          • 避免使用 for(var i=0; i<demo1Arr.length; i++){} 的方式,這樣的數(shù)組長度每次都被計(jì)算,效率低于上面的方式。也可以將變量聲明放在for的前面來執(zhí)行,提高閱讀性
          var i=0, len=demo1Arr.length;
          for(; i<len; i++) {};
          
          • 跳出循環(huán)的方式有如下幾種 return 函數(shù)執(zhí)行被終止 break 循環(huán)被終止 continue 循環(huán)被跳過

          for in

          for(var item in arr|obj){} 可以用于遍歷數(shù)組和對象

          • 遍歷數(shù)組時(shí),item表示索引值, arr表示當(dāng)前索引值對應(yīng)的元素 arr[item]
          • 遍歷對象時(shí),item表示key值,arr表示key值對應(yīng)的value值 obj[item]
          (function () {
            for (var i in demoArr) {
              if (i==2) {
                return; // 函數(shù)執(zhí)行被終止
                // break;  // 循環(huán)被終止
                // continue;  // 循環(huán)被跳過
              };
              console.log('demoArr[' + i + ']:' + demoArr[i]);
            }
            console.log('-------------');
          })();
          
          

          for in 本質(zhì)上遍歷的是對象,之所以能遍歷數(shù)組,是因?yàn)閿?shù)組也是一個(gè)對象。

          var arr=['react', 'vue', 'angular'];
          
          // 等價(jià)于
          
          var arr={
            0: 'react',
            1: 'vue',
            2: 'angular'
          }
          

          關(guān)于for in,有以下幾點(diǎn)需要注意:

          • 在 for 循環(huán)與 for in 循環(huán)中,i 值都會在循環(huán)結(jié)束之后保留下來。因此使用函數(shù)自執(zhí)行的方式避免。
          • 使用 return,break,continue 跳出循環(huán)都與 for 循環(huán)一致,不過關(guān)于 return 需要注意,在函數(shù)體中,return 表示函數(shù)執(zhí)行終止,就算是循環(huán)外面的代碼,也不再繼續(xù)往下執(zhí)行。而 break 僅僅只是終止循環(huán),后面的代碼會繼續(xù)執(zhí)行。
          function res() {
            var demoArr=['Javascript', 'Gulp', 'CSS3', 'Grunt', 'jQuery', 'angular'];
          
            for (var item in demoArr) {
              if (item==2) {
                return;
              };
              console.log(item, demoArr[item]);
            }
            console.log('desc', 'function res'); //不會執(zhí)行
          }
          

          因?yàn)?for in 的目的是為了遍歷對象,因此在遍歷時(shí),會同時(shí)搜索該對象構(gòu)造函數(shù)上的屬性以及原型上的屬性,因此 for in 循環(huán)相對來說消耗會更大一點(diǎn)。因此,如果有其他更好的選擇,則盡量避免考慮使用 for in 循環(huán)來遍歷數(shù)據(jù)。

          forEach

          demoArr.forEach(function(arg) {})

          參數(shù)arg表示數(shù)組每一項(xiàng)的元素,實(shí)例如下

          demoArr.forEach(function (val, index) {
            if (e=='CSS3') {
              return;  // 循環(huán)被跳過
              // break;   // 報(bào)錯(cuò)
              // continue;// 報(bào)錯(cuò)
            };
            console.log(val, index);
          })
          
          

          具體有以下需要注意的地方

          • 回調(diào)函數(shù)中有2個(gè)參數(shù),分別表示值和索引,這一點(diǎn)與 jQuery 中的$.each相反
          • forEach無法遍歷對象
          • forEach無法在IE中使用,firefox和chrome實(shí)現(xiàn)了該方法
          • forEach無法使用 break,continue 跳出循環(huán),使用 return 時(shí),效果和在 for 循環(huán)中使用 continue 一致

          ES5中新增的幾個(gè)數(shù)組方法,forEach, map, filter, reduce等,可以理解為依次對數(shù)組的每一個(gè)子項(xiàng)進(jìn)行一個(gè)處理(回調(diào)函數(shù)中的操作),他們是對簡單循環(huán)的更高一層封裝,因此與單純的循環(huán)在本質(zhì)上有一些不同,所以才會導(dǎo)致 return, continue, break 的不同。

          最重要的一點(diǎn),可以添加第二參數(shù),為一個(gè)數(shù)組,而且回調(diào)函數(shù)中的this會指向這個(gè)數(shù)組。而如果沒有第二參數(shù),則this會指向window。

          var newArr=[];
          demoArr.forEach(function(val, index) {
            this.push(val); // 這里的this指向newArr
          }, newArr)
          

          雖然在原生中 forEach 循環(huán)的局限性很多,但是了解他的必要性在于,很多第三方庫會擴(kuò)展他的方法,使其能夠應(yīng)用在很多地方,比如 angular 的工具方法中,也有 forEach 方法,其使用與原生的基本沒有差別,只是沒有了局限性,可以在IE下使用,也可以遍歷對象

          var result=[];
          angular.forEach(demoArr, function(val, index) {
            this.push(val);
          }, result);
          

          do/while

          函數(shù)具體的實(shí)現(xiàn)方式如下,不過有一點(diǎn)值得注意的是,當(dāng)使用 continue時(shí),如果你將 i++ 放在了后面,那么 i++ 的值將一直不會改變,最后陷入死循環(huán)。因此使用do/while一定要小心謹(jǐn)慎一點(diǎn)。

          // 直接使用while
          (function () {
            var i=0,
              len=demoArr.length;
            while (i < len) {
              if (i==2) {
                // return; // 函數(shù)執(zhí)行被終止
                // break;  // 循環(huán)被終止
                // continue;  // 循環(huán)將被跳過,因?yàn)楹筮叺拇a無法執(zhí)行,i的值沒有改變,因此循環(huán)會一直卡在這里,慎用??!
              };
              console.log('demoArr[' + i + ']:' + demoArr[i]);
              i++;
            }
            console.log('------------------------');
          })();
          
          // do while
          (function () {
            var i=0,
              len=demo3Arr.length;
            do {
              if (i==2) {
                break; // 循環(huán)被終止
              };
              console.log('demo2Arr[' + i + ']:' + demo3Arr[i]);
              i++;
            } while (i < len);
          })();
          

          不建議使用do/while的方式來遍歷數(shù)組

          $.each

          $.each(demoArr|demoObj, function(e, ele))
          可以用來遍歷數(shù)組和對象,其中e表示索引值或者key值,ele表示value值

          $.each(demoArr, function(e, ele) {
            console.log(e, ele);
          })
          

          輸出為

          0 "Javascript"
          1 "Gulp"
          2 "CSS3"
          3 "Grunt"
          4 "jQuery"
          5 "angular"
          

          這里有很多需要注意的地方

          • 使用return 或者return true為跳過一次循環(huán),繼續(xù)執(zhí)行后面的循環(huán)
          • 使用return false為終止循環(huán)的執(zhí)行,但是并不終止函數(shù)執(zhí)行
          • 無法使用break與continue來跳過循環(huán)
          • 循環(huán)中this值輸出類似如下
          console.log(this);
          //String {0: "C", 1: "S", 2: "S", 3: "3", length: 4, [[PrimitiveValue]]: "CSS3"}
          
          console.log(this==ele);
          // true
          
          • 關(guān)于上面的this值,遍歷一下
          $.each(this, function(e, ele) {
            console.log(e, ele);
          })
          
          // 0 c
          // 1 s
          // 2 s
          // 4 3
          

          為什么 length 和 [[PrimitiveValue]]沒有遍歷出來?突然靈光一動(dòng),在《javascript高級編程》中找到了答案,大概意思就是javascript的內(nèi)部屬性中,將對象數(shù)據(jù)屬性中的 Enumerable 設(shè)置為了false

          // 查看length的內(nèi)部屬性
          console.log(Object.getOwnPropertyDescriptor(this, 'length'));
          // Object {value: 4, writable: false, enumerable: false, configurable: false}
          

          (this)` 與this有所不同,不過遍歷結(jié)果卻是一樣,你可以在測試代碼中打印出來看看

          $(selecter).each

          專門用來遍歷DOMList

          $('.list li').each(function (i, ele) {
            console.log(i, ele);
            // console.log(this==ele); // true
            $(this).html(i);
            if ($(this).attr('data-item')=='do') {
              $(this).html('data-item: do');
            };
          })
          
          • i: 序列值 ele: 只當(dāng)前被遍歷的DOM元素
          • this 當(dāng)前被遍歷的DOM元素,不能調(diào)用jQuery方法
          • (ele) 當(dāng)前被遍歷元素的jquery對象,可以調(diào)用jquery的方法進(jìn)行dom操作

          使用for in 遍歷 DOMList

          因?yàn)閐omList并非數(shù)組,而是一個(gè)對象,只是因?yàn)槠鋕ey值為0,1,2... 而感覺與數(shù)組類似,但是直接遍歷的結(jié)果如下

          var domList=document.getElementsByClassName('its');
          for(var item in domList) {
            console.log(item, ':' + domList[item]);
          }
          // 0: <li></li>
          // 1: <li></li>
          //    ...
          // length: 5
          // item: function item() {}
          // namedItem: function namedItem() {}
          

          因此我們在使用for in 遍歷domList時(shí),需要將domList轉(zhuǎn)換為數(shù)組

          var res=[].slice.call(domList);
          for(var item in res) {}
          

          類似這樣的對象還有函數(shù)的屬性 arguments 對象,當(dāng)然字符串也是可以遍歷的,但是因?yàn)樽址渌麑傩缘?enumerable 被設(shè)置成了false,因此遍歷出來的結(jié)果跟數(shù)組是一樣的,也就不用擔(dān)心這個(gè)問題了.

          for of

          for of 用于遍歷可迭代對象「Iterator」。在 JS 中,數(shù)組 Array,字符串 String, Map,Set 等,都是可迭代對象。

          對象中包含 Symbol.iterator 屬性的,都被稱為可迭代對象。

          var arr=[1, 2, 3];
          arr[Symbol.iterator]
          // ? values() { [native code] }
          

          簡單案例。

          const iterable=['react', 'vue', 'angular'];
           
          for (const value of iterable) {
            console.log(value);
          }
          
          • for of 僅僅針對可迭代對象
          • 跳出循環(huán)的方式與 for 循環(huán)保持一致

          小補(bǔ)充

          如果你發(fā)現(xiàn)有些人寫函數(shù)這樣搞,不要驚慌,也不要覺得他高大上鳥不起

          +function(ROOT, Struct, undefined) {
            ... 
          }(window, function() {
              function Person() {}
          })

          ()(), !function() {}() +function() {}() 三種函數(shù)自執(zhí)行的方式

          學(xué)習(xí)是一個(gè)艱苦的過程,當(dāng)然如果能把技術(shù)學(xué)成,最后也一定可以獲得高薪工作。掌握一個(gè)好的學(xué)習(xí)方法,跟對一個(gè)學(xué)習(xí)的人非常重要。今后要是大家有啥問題,可以隨時(shí)來問我,能幫助別人學(xué)習(xí)解決問題,對于自己也是一個(gè)提升的過程。自己整理了一份2020最全面前端學(xué)習(xí)資料,從最基礎(chǔ)的HTML+CSS+JS到HTML5的項(xiàng)目實(shí)戰(zhàn)的學(xué)習(xí)資料都有整理web前端學(xué)習(xí)干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關(guān)注我的頭條號并在后臺私信我:前端,即可免費(fèi)獲取

          JavaScript 作為 Web 開發(fā)的核心語言之一,在前端領(lǐng)域發(fā)揮著至關(guān)重要的作用。數(shù)組作為 JavaScript 中最常用的數(shù)據(jù)結(jié)構(gòu)之一,掌握其遍歷方法對于任何前端開發(fā)者都是必不可少的技能。本文旨在介紹幾種常見的數(shù)組遍歷方式,并通過實(shí)例演示它們的應(yīng)用場景和最佳實(shí)踐。

          技術(shù)概述

          定義

          數(shù)組遍歷是指按照一定的順序訪問數(shù)組中的每一個(gè)元素的過程。JavaScript 提供了多種方法來遍歷數(shù)組,包括傳統(tǒng)的 for 循環(huán)、forEach 方法、map、filter 等高階函數(shù)。

          核心特性與優(yōu)勢

          • 傳統(tǒng) `for` 循環(huán):
          • 特性: 直接訪問索引。
          • 優(yōu)勢: 靈活性高,可以控制循環(huán)的終止條件。
          • `forEach` 方法:
          • 特性: 自動(dòng)迭代數(shù)組中的每個(gè)元素。
          • 優(yōu)勢: 代碼簡潔,易于理解和維護(hù)。
          • `map` 方法:
          • 特性: 創(chuàng)建新數(shù)組,對原數(shù)組每個(gè)元素執(zhí)行函數(shù)并返回新值。
          • 優(yōu)勢: 方便轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)。
          • `filter` 方法:
          • 特性: 創(chuàng)建新數(shù)組,包含通過測試的所有元素。
          • 優(yōu)勢: 用于篩選數(shù)據(jù)。

          示例代碼

          const numbers=[1, 2, 3, 4, 5];
          
          // 使用 for 循環(huán)
          for (let i=0; i < numbers.length; i++) {
            console.log(numbers[i]);
          }
          
          // 使用 forEach
          numbers.forEach(function(number) {
            console.log(number);
          });
          
          // 使用 map
          const doubled=numbers.map(function(number) {
            return number * 2;
          });
          console.log(doubled);
          
          // 使用 filter
          const evenNumbers=numbers.filter(function(number) {
            return number % 2===0;
          });
          console.log(evenNumbers);
          

          技術(shù)細(xì)節(jié)

          遍歷原理

          數(shù)組遍歷的基本原理是按照一定的順序訪問數(shù)組中的每個(gè)元素。不同的遍歷方法內(nèi)部實(shí)現(xiàn)有所不同,但最終目的是相同的。

          • `for` 循環(huán):
          • 原理: 通過索引直接訪問數(shù)組元素。
          • 注意事項(xiàng): 索引越界問題。
          • `forEach` 方法:
          • 原理: 內(nèi)部使用迭代器模式。
          • 注意事項(xiàng): 無法中斷遍歷過程。
          • `map` 方法:
          • 原理: 對每個(gè)元素應(yīng)用函數(shù)并返回新數(shù)組。
          • 注意事項(xiàng): 不改變原數(shù)組。
          • `filter` 方法:
          • 原理: 對每個(gè)元素應(yīng)用函數(shù)判斷是否保留。
          • 注意事項(xiàng): 同樣不改變原數(shù)組。

          難點(diǎn)

          • 中斷遍歷: forEach 方法不能直接使用 breakreturn 中斷遍歷。
          • 性能考慮: mapfilter 返回新數(shù)組,可能導(dǎo)致內(nèi)存消耗增加。

          實(shí)戰(zhàn)應(yīng)用

          場景與案例

          假設(shè)我們需要從一個(gè)數(shù)組中找出所有的偶數(shù),并計(jì)算這些偶數(shù)的平方。

          問題與解決方案

          問題: 如何高效地找到所有偶數(shù)并計(jì)算它們的平方?

          解決方案: 使用 filter 方法篩選出偶數(shù),再使用 map 方法計(jì)算平方。

          示例代碼

          const numbers=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
          
          // 使用 filter 和 map
          const evenSquares=numbers
            .filter(number=> number % 2===0)
            .map(number=> number * number);
          
          console.log(evenSquares); // 輸出: [4, 16, 36, 64, 100]
          

          優(yōu)化與改進(jìn)

          潛在問題

          • 性能: 在大數(shù)據(jù)量下使用 mapfilter 可能導(dǎo)致性能下降。
          • 內(nèi)存: 過多使用高階函數(shù)可能會增加內(nèi)存占用。

          優(yōu)化建議

          • 減少循環(huán)次數(shù): 嘗試合并操作以減少循環(huán)次數(shù)。
          • 使用緩存: 如果結(jié)果不變,可以緩存結(jié)果以減少重復(fù)計(jì)算。

          示例代碼

          // 緩存結(jié)果
          const cache={};
          
          function getEvenSquares(numbers) {
            if (cache[numbers]) {
              return cache[numbers];
            }
          
            const result=numbers
              .filter(number=> number % 2===0)
              .map(number=> number * number);
          
            cache[numbers]=result;
          
            return result;
          }
          

          常見問題

          問題及解決

          問題: 如何在 forEach 中中斷循環(huán)?

          解決方案: 使用 for 循環(huán)或 Array.prototype.some() 方法。

          // 使用 some
          const numbers=[1, 2, 3, 4, 5];
          let found=false;
          
          numbers.some(function(number) {
            if (number > 3) {
              found=true;
              return true; // 終止循環(huán)
            }
          });
          
          console.log(found); // 輸出: true
          

          總結(jié)與展望

          通過本文的學(xué)習(xí),我們了解了 JavaScript 數(shù)組遍歷的多種方法及其應(yīng)用場景。每種方法都有其特點(diǎn)和適用場合,合理選擇可以提高代碼的效率和可讀性。隨著 JavaScript 語言的發(fā)展,新的遍歷方法和優(yōu)化技巧會不斷出現(xiàn),我們期待未來能有更多實(shí)用高效的工具和技術(shù)出現(xiàn),以進(jìn)一步提升前端開發(fā)的效率和質(zhì)量。

          希望本文能為你在實(shí)際開發(fā)中遇到的問題提供一些解決方案和思路,同時(shí)也鼓勵(lì)你不斷學(xué)習(xí)新的技術(shù)和方法,以應(yīng)對日益復(fù)雜的前端開發(fā)挑戰(zhàn)。

          、for...in 語句


          1.1 遍歷對象屬性名稱

          for...in 語句常用于遍歷特定對象的屬性,包括字段名稱屬性及函數(shù)名稱屬性。在JavaScript語言中,它們均稱為屬性 (property)。

          let obj={
            name: 'obj',
          
            showName() {
              console.log(this.name);
            }
          };
          
          for (const propName in obj) {
            console.log(propName, typeof(obj[propName]));
          }

          顯示:

          name – "string"
          showName – "function"

          利用這一點(diǎn),可方便地查看特定對象的所有屬性或方法名稱。下面語句打印出console對象所有的屬性:

          for (const propName in console) {
            console.log(propName, typeof(console[propName]));
          }

          顯示:

          debug – "function"
          error – "function"
          log – "function"
          info – "function"
          warn – "function"
          clear – "function"
          ...

          可以看出,這些屬性全部均是console的函數(shù)名稱,因?yàn)閏onsole沒有屬性名稱。

          1.2 遍歷數(shù)組索引值

          for...in 用于數(shù)組中,則遍歷數(shù)組索引值。

          let array=['a', 'b', 'c'];
          
          for (const index in array) {
            console.log(index, array[index]);
          }

          顯示:

          0 – "a"
          1 – "b"
          2 – "c"

          1.3 遍歷字符串索引值

          由于字符串是由字符組成的數(shù)組,因此 for...in 也可用于遍歷字符串的索引值。

          let str="abc";
          
          for (const index in str) {
            console.log(index, str[index]);
          }

          顯示:

          0 – "a"
          1 – "b"
          2 – "c"

          2、for...of 語句


          for...of 語句用于遍歷可遍歷對象 (iterable objects)的元素。這些可遍歷對象包括字符串、數(shù)組、以及類似于數(shù)組的對象,這些對象都帶有l(wèi)ength屬性。

          2.1 不能用于遍歷對象屬性名稱

          for...of 語句不能用于遍歷對象的屬性名稱。因此,下面的代碼是錯(cuò)誤的:

          let obj={
            name: 'obj',
          
            showName() {
              console.log(this.name);
            }
          };
          
          for (const propName of obj) {
            console.log(propName);
          }

          顯示:

          TypeError: undefined is not a function (near '...propName of obj...')

          意為,將 for...of 語句用于對象上面,無法提取具體的數(shù)值。

          2.2 遍歷數(shù)組元素

          for...of 語句經(jīng)常用于遍歷數(shù)組中各元素的數(shù)值。

          let arr=[2, 4, 6, 8, 10];
          
          for (const value of arr) {
            console.log(value);
          }

          顯示:

          2
          4
          6
          8
          10

          2.3 遍歷字符串中的字符

          由于字符串是由字符組成的數(shù)組,因此 for...of 也可用于遍歷字符串的字符。

          let str="abc";
          
          for (const letter of str) {
            console.log(letter);
          }

          顯示:

          a
          b
          c

          2.4 解包

          數(shù)組元素如果是帶有特定屬性名稱的對象,可利用解包性質(zhì)來快速遍歷這些屬性值。看下面例子。

          function Point(x, y) {
            return {x:x, y:y};
          }
          
          let points=[Point(1, 2), Point(2, 3), Point(4, 5)];
          
          for (const point of points) {
            console.log(point.x, point.y);
          }
          

          可將Point視為一個(gè)構(gòu)造器 (constructor),每次調(diào)用Point(x, y)都會創(chuàng)建并返回該類的一個(gè)對象,且含有x及y的屬性名稱。points則是一個(gè)含有多個(gè)Point對象的數(shù)組。上面的代碼遍歷出每個(gè)Point對象后,賦值于point變量,然后打印出它們的x值及y值。

          如果我們不希望每次都通過引用對象屬性的方式來訪問x及y值,則可編寫代碼如下:

          for (const point of points) {
            let x=point.x;
            let y=point.y;
            console.log(x, y);
          }

          這一步可利用ES6的const解包特性予以簡化:

          for (const point of points) {
            const {x, y}=point;
            console.log(x, y);
          }

          更進(jìn)一步,我們可以直接解包:

          for (const {x, y} of points) {
            console.log(x, y);
          }

          2.5 遍歷Map

          let scoreMap=new Map([
              ['Mike', 75],
              ['Tom', 80],
              ['Smith', 90]
          ]);
          
          for (const [key, value] of scoreMap) {
              console.log(key, value);
          }

          與上一節(jié)不同的是,Map需要使用 [key, value] 的方式來解包。

          3、forEach 方法


          3.1 forEach 常見調(diào)用方式

          for...in,for...of 均是語句,與它們不同的是,forEach是數(shù)組的內(nèi)嵌方法。這意味著我們可以直接在數(shù)組對象上面直接調(diào)用該方法。

          let arr=[1, 3, 5, 7, 9];
          
          arr.forEach((element)=> {
            console.log(element);
          });

          作為數(shù)組方法,forEach有一個(gè)參數(shù),該參數(shù)的類型是函數(shù),稱為回調(diào)函數(shù) (callback function)。所謂回調(diào)函數(shù),是指一旦程序員提供了這樣的函數(shù),JavaScript引擎將負(fù)責(zé)調(diào)用此函數(shù)。

          回調(diào)函數(shù)的價(jià)值在于回調(diào)函數(shù)可能存在多個(gè)參數(shù),而這些參數(shù)將由JavaScript引擎自動(dòng)提供。在回調(diào)函數(shù)中,我們可對JavaScript引擎所自動(dòng)提供的參數(shù)進(jìn)行進(jìn)一步加工。

          在上面的回調(diào)函數(shù)中,element是由JavaScript引擎自動(dòng)提供的,代表每個(gè)數(shù)組元素。

          上面的代碼采用了lambda匿名表達(dá)式。它等同于:

          let arr=[1, 3, 5, 7, 9];
          
          function callback(element) {
            console.log(element);
          }
          
          arr.forEach(callback);

          可見,lambda表達(dá)式更加簡練。

          3.2 forEach 的參數(shù)

          forEach共有3個(gè)參數(shù) (上面例子只用了第1個(gè)),它們的排列順序如下:

          arr.forEach((element, index, array)=> {
            console.log(element);
            console.log(index);
            console.log(array);
          });

          參數(shù)element是數(shù)組元素,參數(shù)index是數(shù)組元素所在數(shù)組中的索引值,參數(shù)array是整個(gè)數(shù)組。

          一般情況下,我們僅需用到element及index參數(shù)就足夠了。由于是每次迭代,因此,forEach方法中的array參數(shù)較少用到。

          index每次遍歷時(shí)都會加1,且每次都會與array的長度比較。一旦超出array的界限,就會終止遍歷。如果遍歷過程中,修改了array的長度,則需特別注意這一點(diǎn)。

          3.2 forEach 遍歷的終止

          如何中止forEach的遍歷?JavaScript并未提供這樣的機(jī)制,但我們可以用一個(gè)雙重嵌套的異常來終止遍歷。

          let arr=[1, 3, 5, 7, 9];
          
          try {
            arr.forEach((element, index, array)=> {
              try {
                console.log(index);
                if (index >=3) {
                  throw new Error('forEach termination signal');
                }
              } catch (error) {
                throw error;
              }
            });
          } catch (e) {
            if (e.message==='forEach termination signal') {
              console.log('forEach terminated.');
            }
          }
          
          console.log('This line of code should be executed.');

          顯示:

          0
          1
          2
          3
          forEach terminated.
          This line of code should be executed.

          我們設(shè)定,當(dāng)index的值大于等于3時(shí),需要終止遍歷。這樣,在第7行,當(dāng)此條件滿足時(shí),即拋出"forEach termination signal"的異常。

          此時(shí),程序流程轉(zhuǎn)入到第10行至第12行最內(nèi)層的異常捕獲處理代碼:

          } catch (error) {
              throw error;
          }

          捕獲異常后,如果我們不重新拋出異常,JavaScript引擎則會認(rèn)為我們已正確地處理了異常,因此會恢復(fù)中斷的遍歷進(jìn)程,繼續(xù)處理下一個(gè)數(shù)組元素,這不是我們想要的。因此,我們在此重新拋出該異常,以切實(shí)終止遍歷。

          這時(shí),forEach的遍歷因異常而終止,從而達(dá)到了我們的最初的目標(biāo)。但因?yàn)橛挟惓?,如果我們未作任何處理,則該異常會導(dǎo)致整個(gè)程序都終止運(yùn)行。只有在我們處理了異常后,程序才能往下走。這就是第14行至18行最外層異常捕獲代碼的作用:

          } catch (e) {
            if (e.message==='forEach termination signal') {
              console.log('forEach terminated');
            }
          }

          先判斷它是不是"forEach termination signal"。如果是,則簡單地打印一行消息。由于這里未再拋出新的異常,因此JavaScript引擎認(rèn)為我們已經(jīng)正確地處理了異常,則繼續(xù)執(zhí)行后面的代碼。這樣,最后一行第20行語句將被執(zhí)行并打印出"This line of code should be executed."的文本。

          一般來講,如果我們需要在數(shù)組的遍歷過程中終止遍歷,不要使用 forEach 語句,使用最傳統(tǒng)的方式即可:

          let arr=[1, 3, 5, 7, 9];
          
          for (let i=0; i < arr.length; i++) {
            console.log(i, arr[i]);
            if (i >=3) {
              break;
            }
          }
          
          console.log('This line of code should be executed.');

          這樣即可在遍歷中訪問數(shù)組的索引值與數(shù)組元素,又可以極為方便地隨時(shí)終止遍歷。


          主站蜘蛛池模板: 亚洲综合一区二区三区四区五区| 国产成人精品一区二区三区免费| 亚洲AV无码一区二区三区系列| 丰满爆乳无码一区二区三区| 变态拳头交视频一区二区| 久久精品国产一区二区三区肥胖| 一区二区视频免费观看| 人妻在线无码一区二区三区| 少妇无码一区二区三区免费| 福利一区二区三区视频在线观看| 亚洲日本一区二区一本一道 | 国产一区二区不卡在线播放| 精品久久久中文字幕一区| 美女视频一区三区网站在线观看 | 亚洲一区二区三区乱码A| 精品亚洲福利一区二区| 日本人的色道www免费一区| 亚洲欧美日韩一区二区三区在线| 亚洲日本va一区二区三区| 国产精品电影一区| 波多野结衣久久一区二区| 91精品国产一区二区三区左线| 一区二区三区亚洲| 人妻无码第一区二区三区| 亚洲bt加勒比一区二区| 日韩一区二区三区无码影院 | 日本精品夜色视频一区二区| 国产SUV精品一区二区88L| 精品天海翼一区二区| 视频一区二区在线播放| 国产99精品一区二区三区免费| 亚洲国产专区一区| 久久久久无码国产精品一区| 农村人乱弄一区二区| 久久久无码精品国产一区| 中文字幕无码不卡一区二区三区| 久久一区二区三区精华液使用方法| 亚洲av日韩综合一区久热| 在线不卡一区二区三区日韩| 精品国产日韩亚洲一区| 亚洲AV综合色区无码一区爱AV|