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