摘要:和數(shù)組遍歷方法詳解在中常用的種數(shù)組遍歷方法原始的循環(huán)語句數(shù)組對象內(nèi)置方法數(shù)組對象內(nèi)置方法數(shù)組對象內(nèi)置方法數(shù)組對象內(nèi)置方法數(shù)組對象內(nèi)置方法數(shù)組對象內(nèi)置方法數(shù)組對象內(nèi)置方法數(shù)組對象內(nèi)置方法循環(huán)語句中新增加了一種循環(huán)語句三種數(shù)組循環(huán)示例如下原始循
ES5和ES6數(shù)組遍歷方法詳解 在ES5中常用的10種數(shù)組遍歷方法:
1、原始的for循環(huán)語句ES6中新增加了一種:
2、Array.prototype.forEach數(shù)組對象內(nèi)置方法
3、Array.prototype.map數(shù)組對象內(nèi)置方法
4、Array.prototype.filter數(shù)組對象內(nèi)置方法
5、Array.prototype.reduce數(shù)組對象內(nèi)置方法
6、Array.prototype.some數(shù)組對象內(nèi)置方法
7、Array.prototype.every數(shù)組對象內(nèi)置方法
8、Array.prototype.indexOf數(shù)組對象內(nèi)置方法
9、Array.prototype.lastIndexOf數(shù)組對象內(nèi)置方法
10、for...in循環(huán)語句
1.for...of循環(huán)語句ES5三種數(shù)組循環(huán)示例如下: 原始for循環(huán)語句
Example1
var a = [1,2,3]; for(var i=0;i代碼解讀:原始for循環(huán)的優(yōu)點在于大家都比較熟悉,容易理解,劣勢是寫起來比較繁瑣,需要定義額外更多的變量,所以一下是針對于原始for循環(huán)的改良的兩種寫法:
Example1:寫法改良版var a = [1,2,3]; for(var i=a.length;i--;){ console.log(a[i]); //結(jié)果依次為3,2,1 }Example2:性能改良版
var a = [1,2,3]; for(var i = 0,len=a.length; i < len; i++) { console.log(a[i]); //結(jié)果依次為1,2,3 }注意:以上代碼可以寫成這樣呢,如果懵逼了的話接著看原始for循環(huán)的解讀,我們都知道for循環(huán)包含三個語句塊——>for(語句1;語句2;語句3){被執(zhí)行的代碼},其中,語句1一般為變量定義語句(不僅可以只定義一個變量哦),在循環(huán)開始前執(zhí)行,而且只執(zhí)行一次;語句2定義循環(huán)的是否繼續(xù)執(zhí)行的條件,同樣也是在循環(huán)開始前執(zhí)行,語句1之后執(zhí)行,每次重新開始循環(huán)都會再次執(zhí)行;語句3則在循環(huán)結(jié)束之后執(zhí)行,并且每次結(jié)束的時候都會再次執(zhí)行,這里要注意的是如果被執(zhí)行的代碼中途return出來了那是不會再執(zhí)行一次語句3的,所以以上代碼解釋如下:因為i--這個語句在每次循環(huán)開始前都會再次先用 i 是true和false來判斷是否繼續(xù)執(zhí)行,這里同樣要注意的是由于i--和--i的區(qū)別,這里由于是i--所以會先判斷i的值再去做‘減減’的操作,所以這里最后如果打印 i 的值,會發(fā)現(xiàn)其實是-1。
數(shù)組內(nèi)置方法Array.prototype.forEachExample
var a = [1,2,3]; a.forEach(function(value,key,arr){ console.log(value) // 結(jié)果依次為1,2,3 console.log(key) // 結(jié)尾依次為0,1,2 console.log(arr) // 三次結(jié)果都為[1,2,3],該參數(shù)貌似沒什么用 })代碼解讀:forEach方法最大的好處就是便于使用,而且不用定義額外的參數(shù)變量,但是從效率以及性能角度來說它是劣于原始for循環(huán)的,而且也不能強制return結(jié)束循環(huán),原因如下:
**forEach循環(huán)**一看就是通過**回調(diào)函數(shù)**來提供參數(shù)的,而回調(diào)函數(shù)在JS中是**閉包**的一種,閉包的作用是用來生成**私有作用域**的,所以,每一個回調(diào)函數(shù)都是一個**獨立的作用域**,都擁有自己獨立的存儲空間,互不影響,而且內(nèi)部變量還不及時釋放,這也就是為什么在能不用閉包的情況下就不要用閉包的原因,而在閉包中return的話,也只是在當前回調(diào)函數(shù)中返回了,可是forEach中的其他的回調(diào)函數(shù)(閉包)仍然存在,所以,導致return是沒辦法結(jié)束循環(huán)的。下面寫一個forEach循環(huán)實現(xiàn)例子供大家參考理解:Example
Array.prototype.forEachCopy = function(callback){ var arr = this; for(var i=0;i數(shù)組內(nèi)置方法Array.prototype.map Example
var a = [1,2,3]; var b = a.map(function(value,key,arr){ console.log(value) // 結(jié)果依次為1,2,3 console.log(key) // 結(jié)尾依次為0,1,2 console.log(arr) // 三次結(jié)果都為[1,2,3] return value+1; }) console.log(a); // 結(jié)果為[ 1, 2, 3 ] console.log(b); // 結(jié)果為[ 2, 3, 4 ]代碼解讀:map和forEach不同,在forEach中return語句是沒有任何效果的,而map則可以改變當前循環(huán)的值,并且最終會返回一個新的被改變過值之后的數(shù)組(map如果不用return就和forEach一樣了),由于這個特性,map一般用來處理需要修改某一個數(shù)組的值。map和forEach在其他的方面都是一樣的,也不能return結(jié)束循環(huán)等特性,下面寫一個map循環(huán)實現(xiàn)的例子供大家參考理解:
ExampleArray.prototype.mapCopy = function(callback){ var arr = this; var arrCopy = []; for(var i=0;i數(shù)組內(nèi)置方法Array.prototype.filter Example
var a = [1,2,3]; var b = a.filter(function(value,key,arr){ console.log(value) // 結(jié)果依次為1,2,3 console.log(key) // 結(jié)尾依次為0,1,2 console.log(arr) // 三次結(jié)果都為[1,2,3] if(value === 3){ return false; } return true; }) console.log(a); // 結(jié)果為[ 1, 2, 3 ] console.log(b); // 結(jié)果為[ 1,2 ]代碼解讀:filter和map不同,map目的是為了改變值,而filter目的是為了去掉不要的值,在循環(huán)的時候如果返回的是false那么就表示本次循環(huán)的不添加該值,返回true則相反是表示要添加到新建的數(shù)組中,下面寫一個filter循環(huán)實現(xiàn)例子供大家參考:
ExampleArray.prototype.filterCopy = function(callback){ var arr = this; var arrCopy = []; for(var i=0;i數(shù)組內(nèi)置方法Array.prototype.reduce Example
var a = [1,2,3]; var b = a.reduce(function (count, value,key,arry) { console.log(count); // 結(jié)果依次為0,1,3 console.log(value); // 結(jié)果依次為1,2,3 console.log(key); // 結(jié)果依次為0,1,2 console.log(arry) // 三次結(jié)果都為[1,2,3] return count + value; },0); console.log(a); // 結(jié)果為[ 1, 2, 3 ] console.log(b) // 結(jié)果為6代碼解讀:reduce的不同之處在于累加,和其他幾個內(nèi)置方法不同的地方,它的第二個參數(shù)不是this對象,而是初始累加值(如果不設(shè)置的話數(shù)組會亂掉),而且回調(diào)函數(shù)的的個數(shù)也不同,比其他的多了一個,而且還在在開始的多加了一個參數(shù),第一個參數(shù)記錄的是上一次循環(huán)的累加值,下面寫一個reduce循環(huán)實現(xiàn)例子供大家參考:
ExampleArray.prototype.reduceCopy = function(callback,countInit){ var arr = this; for(var i=0;i數(shù)組內(nèi)置方法Array.prototype.some Example
var a = [1,2,3]; var b = a.some(function(value,key,arry){ console.log(value); // 結(jié)果依次為1,2 console.log(key); // 結(jié)果依次為0,1 console.log(arry); // 兩次次結(jié)果都為[1,2,3] return value===2; }) console.log(a); // 結(jié)果為[ 1, 2, 3 ] console.log(b); // 結(jié)果為true代碼解讀:some的不同之處在它返回的布爾值,它的作用有點像filter,不過它的目的不是為了篩選返回數(shù)組,而是為了篩選該數(shù)組是否有滿足你要的值,而且找到符合條件的值返回了一次true之后就不會再繼續(xù)執(zhí)行了,下面寫一個some循環(huán)實現(xiàn)例子供大家參考:
Example
Array.prototype.someCopy = function(callback,countInit){ var arr = this; var isBool = false; for(var i=0;i數(shù)組內(nèi)置方法Array.prototype.every Example
var a = [1,2,3]; var b = a.every(function(value,key,arry){ console.log(value); // 結(jié)果依次為1,2 console.log(key); // 結(jié)果依次為0,1 console.log(arry); // 兩次次結(jié)果都為[1,2,3] return value===2; }) console.log(a); // 結(jié)果為[ 1, 2, 3 ] console.log(b); // 結(jié)果為false代碼解讀:其實從看例子可以看出來,some和every作用是一樣的,只不過some當找到之后返回的是true,而every找到之后返回的是false而已,下面寫一個every循環(huán)實現(xiàn)例子供大家參考:
Example
Array.prototype.everyCopy = function(callback){ var arr = this; var isBool = true; for(var i=0;i數(shù)組內(nèi)置方法Array.prototype.indexOf Example
var a = [1,2,3]; var b = a.indexOf(2); console.log(a); // 結(jié)果為[ 1, 2, 3 ] console.log(b); // 結(jié)果為1代碼解讀:對于indexOf方法來說,在數(shù)組循環(huán)過程中會和傳入的參數(shù)比對,如果是比對成功,那么終止循環(huán),返回對比成功的下標,下面寫一個indexOf循環(huán)實現(xiàn)例子供大家參考:
Example
Array.prototype.indexOfCopy = function(value){ var arr = this; var index = -1; for(var i=0;i數(shù)組內(nèi)置方法Array.prototype.lastIndexOf Example
var a = [1,2,3,1]; var b = a.lastIndexOf(1); console.log(a); // 結(jié)果為[ 1, 2, 3, 1 ] console.log(b); // 結(jié)果為1代碼解讀:lastIndexOf方法和indexOf作用一致,但查找方向不同,indexOf是正向查找,lastIndexOf是你像查找,找到之后返回成功的下標,下面寫一個lastIndexOf循環(huán)實現(xiàn)例子供大家參考:
Example
Array.prototype.lastIndexOf = function(value){ var arr = this; var index = -1; for(var i=arr.length;i--;){ if(arr[i] === value){ index = i; return index } } return index; } var a = [1,2,3,1]; var b = a.lastIndexOf(1); console.log(a); // 結(jié)果為[ 1, 2, 3 , 1 ] console.log(b); // 結(jié)果為3小結(jié):對于以上8個數(shù)組的內(nèi)置方法,forEach方法僅僅只是為了循環(huán),并不可以幫你做額外的事情;map方法相當于在循環(huán)的時候你告訴數(shù)組當前遍歷的這個值需要改成什么樣,那么它就會最后給什么樣的數(shù)組;filter方法相當于在循環(huán)的時候數(shù)組遍歷一個個對象,并問你這個是不是你要找的值,如果你說是,他就會給你返回一個到新的數(shù)組中,不是他就會剔除;reduce方法相當于循環(huán)遍歷對象做統(tǒng)計(累加或者累減之類的);some和every方法相當于在遍歷的時候拿著一個個對象問你這個是不是你找的,只要你說了一遍是,那么他就會給你分別返回的是true和false;indexOf和lastIndexOf方法相當于你告訴它你要找什么值,找到之后立馬返回給你它的門牌號。循環(huán)語句for...inExample
var a = [1,2,3]; for(var key in a){ console.log(key); //結(jié)果為依次為0,1,2 } var b = {0:1,1:2,2:3}; for(var key in b){ console.log(key); //結(jié)果為依次為0,1,2 }代碼解讀:從結(jié)果得知,for...in遍歷數(shù)組的時候是遍歷數(shù)組的下標值,而在遍歷對象的時候遍歷的是key值,所以猜想,數(shù)組在JS中,本質(zhì)上也是一個以鍵值對形式存在的對象,而為了證明這點,我們做如下一個例子的實驗:
var a = []; a["b"] = 2; console.log(a); //結(jié)果為[ b: 2 ] console.log(a[0]); //結(jié)果為undefined我們發(fā)現(xiàn)數(shù)組的下標不在對應(yīng)相應(yīng)位置的值了,由此可以證明在JS中數(shù)組其實本質(zhì)上就是一個以下標為key值的對象。
當然對于for...in循環(huán)語句本身而言,它是一個淺度遍歷對象的循環(huán)語句,值遍歷第一層節(jié)點(當然對象中設(shè)置不可枚舉的屬性的除外)。
Examplevar a = {b:{c:2},d:{c:4}}; for(var key in a){ console.log(key); //結(jié)果為依次為b,d }ES6循環(huán)for...of語句Example
var a = [1,2,3]; for(var value of a){ console.log(value) // 結(jié)果依次為1,2,3 }代碼解讀:for...of語句看著有點像for...in語句,但是和for...in語句不同的是它不可以循環(huán)對象,只能循環(huán)數(shù)組。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/84026.html
摘要:例如,會刪除數(shù)組中的前兩項。插入的項數(shù)不必與刪除的項數(shù)相等。對數(shù)組進行遍歷循環(huán),對數(shù)組中的每一項運行給定函數(shù)。判斷數(shù)組中是否存在滿足條件的項,只要有一項滿足條件,就會返回。 深入理解ECMA2015(四) —— 數(shù)組的擴展 一、JavaScript數(shù)組詳解回顧(ES6之前) (1)數(shù)組的創(chuàng)建 使用 Array 構(gòu)造函數(shù): var arr1 = new Array(); //創(chuàng)建一個...
摘要:結(jié)果為依次為循環(huán)語句結(jié)果依次為,,代碼解讀語句看著有點像語句,但是和語句不同的是它不可以循環(huán)對象,只能循環(huán)數(shù)組。 ES5和ES6數(shù)組遍歷方法詳解 在ES5中常用的10種數(shù)組遍歷方法: 1、原始的for循環(huán)語句2、Array.prototype.forEach數(shù)組對象內(nèi)置方法3、Array.prototype.map數(shù)組對象內(nèi)置方法4、Array.prototype.filter數(shù)組對象...
摘要:創(chuàng)建數(shù)組數(shù)組字面量數(shù)組構(gòu)造函數(shù)參數(shù)為數(shù)組建議使用數(shù)組字面量方式,性能好,代碼少,簡潔,畢竟代碼少。數(shù)組判斷方法用來判斷某個值是否為。的這是最簡潔最直接的遍歷數(shù)組元素的語法。把數(shù)組轉(zhuǎn)換為本地數(shù)組,并返回結(jié)果。 前端學習:前端教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:數(shù)組&數(shù)組方法使用詳解 Array對象 之前一...
摘要:將數(shù)組中的每個元素展開為函數(shù)參數(shù)擴展運算符取代方法的一個實際的例子,應(yīng)用方法,簡化求出一個數(shù)組最大元素的寫法。 歡迎訪問我的個人博客:http://www.xiaolongwu.cn 前言 記錄一下在實際開發(fā)中,很有用的三個es6的新方法 用法詳解 默認參數(shù) function f(x, y=13) { // 如果沒有傳入y或傳入了undefined,y的默認值為13 retur...
閱讀 2817·2023-04-25 14:59
閱讀 1065·2021-11-22 11:59
閱讀 752·2021-11-17 09:33
閱讀 2542·2021-09-27 13:34
閱讀 4038·2021-09-09 11:55
閱讀 2410·2019-08-30 15:44
閱讀 1216·2019-08-30 14:06
閱讀 2001·2019-08-29 16:55