摘要:結(jié)果為依次為循環(huán)語(yǔ)句結(jié)果依次為,,代碼解讀語(yǔ)句看著有點(diǎn)像語(yǔ)句,但是和語(yǔ)句不同的是它不可以循環(huán)對(duì)象,只能循環(huán)數(shù)組。
ES5和ES6數(shù)組遍歷方法詳解 在ES5中常用的10種數(shù)組遍歷方法:
ES6中新增加了一種: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ì)象內(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ǔ)句
ES5三種數(shù)組循環(huán)示例如下: 原始for循環(huán)語(yǔ)句1.for...of循環(huán)語(yǔ)句
Example1
var a = [1,2,3]; for(var i=0;i代碼解讀:原始for循環(huán)的優(yōu)點(diǎn)在于大家都比較熟悉,容易理解,劣勢(shì)是寫起來比較繁瑣,需要定義額外更多的變量,所以一下是針對(duì)于原始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(i = 0,len=a.length; i < len; i++) { console.log(a[i]); //結(jié)果依次為1,2,3 }注意:以上代碼可以寫成這樣呢,如果懵逼了的話接著看原始for循環(huán)的解讀,我們都知道for循環(huán)包含三個(gè)語(yǔ)句塊——>for(語(yǔ)句1;語(yǔ)句2;語(yǔ)句3){被執(zhí)行的代碼},其中,語(yǔ)句1一般為變量定義語(yǔ)句(不僅可以只定義一個(gè)變量哦),在循環(huán)開始前執(zhí)行,而且只執(zhí)行一次;語(yǔ)句2定義循環(huán)的是否繼續(xù)執(zhí)行的條件,同樣也是在循環(huán)開始前執(zhí)行,語(yǔ)句1之后執(zhí)行,每次重新開始循環(huán)都會(huì)再次執(zhí)行;語(yǔ)句3則在循環(huán)結(jié)束之后執(zhí)行,并且每次結(jié)束的時(shí)候都會(huì)再次執(zhí)行,這里要注意的是如果被執(zhí)行的代碼中途return出來了那是不會(huì)再執(zhí)行一次語(yǔ)句3的,所以以上代碼解釋如下:因?yàn)?strong>i--這個(gè)語(yǔ)句在每次循環(huán)開始前都會(huì)再次先用 i 是true和false來判斷是否繼續(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ù)貌似沒什么用 })代碼解讀:forEach方法最大的好處就是便于使用,而且不用定義額外的參數(shù)變量,但是從效率以及性能角度來說它是劣于原始for循環(huán)的,而且也不能強(qiáng)制return結(jié)束循環(huán),原因如下:
**forEach循環(huán)**一看就是通過**回調(diào)函數(shù)**來提供參數(shù)的,而回調(diào)函數(shù)在JS中是**閉包**的一種,閉包的作用是用來生成**私有作用域**的,所以,每一個(gè)回調(diào)函數(shù)都是一個(gè)**獨(dú)立的作用域**,都擁有自己獨(dú)立的存儲(chǔ)空間,互不影響,而且內(nèi)部變量還不及時(shí)釋放,這也就是為什么在能不用閉包的情況下就不要用閉包的原因,而在閉包中return的話,也只是在當(dāng)前回調(diào)函數(shù)中返回了,可是forEach中的其他的回調(diào)函數(shù)(閉包)仍然存在,所以,導(dǎo)致return是沒辦法結(jié)束循環(huán)的。下面寫一個(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ǔ)句是沒有任何效果的,而map則可以改變當(dāng)前循環(huán)的值,并且最終會(huì)返回一個(gè)新的被改變過值之后的數(shù)組(map如果不用return就和forEach一樣了),由于這個(gè)特性,map一般用來處理需要修改某一個(gè)數(shù)組的值。map和forEach在其他的方面都是一樣的,也不能return結(jié)束循環(huán)等特性,下面寫一個(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ù)組中,下面寫一個(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è),而且還在在開始的多加了一個(gè)參數(shù),第一個(gè)參數(shù)記錄的是上一次循環(huán)的累加值,下面寫一個(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,不過它的目的不是為了篩選返回?cái)?shù)組,而是為了篩選該數(shù)組是否有滿足你要的值,而且找到符合條件的值返回了一次true之后就不會(huì)再繼續(xù)執(zhí)行了,下面寫一個(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í)從看例子可以看出來,some和every作用是一樣的,只不過some當(dāng)找到之后返回的是true,而every找到之后返回的是false而已,下面寫一個(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方法來說,在數(shù)組循環(huán)過程中會(huì)和傳入的參數(shù)比對(duì),如果是比對(duì)成功,那么終止循環(huán),返回對(duì)比成功的下標(biāo),下面寫一個(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),下面寫一個(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循環(huán)語(yǔ)句for...in小結(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ì)象,并問你這個(gè)是不是你要找的值,如果你說是,他就會(huì)給你返回一個(gè)到新的數(shù)組中,不是他就會(huì)剔除;reduce方法相當(dāng)于循環(huán)遍歷對(duì)象做統(tǒng)計(jì)(累加或者累減之類的);some和every方法相當(dāng)于在遍歷的時(shí)候拿著一個(gè)個(gè)對(duì)象問你這個(gè)是不是你找的,只要你說了一遍是,那么他就會(huì)給你分別返回的是true和false;indexOf和lastIndexOf方法相當(dāng)于你告訴它你要找什么值,找到之后立馬返回給你它的門牌號(hào)。
Example
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.hztianpu.com/yun/83990.html
摘要:忍者級(jí)別的函數(shù)操作對(duì)于什么是匿名函數(shù),這里就不做過多介紹了。我們需要知道的是,對(duì)于而言,匿名函數(shù)是一個(gè)很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個(gè)供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果...
摘要:很多人可能誤認(rèn)為資源跨域時(shí)無法請(qǐng)求,實(shí)質(zhì)上請(qǐng)求是可以正常發(fā)起的指通常情況下,部分瀏覽器存在部分特例,后端也可能正常進(jìn)行了處理,中文指南調(diào)試技巧指南前端掘金作者緝熙簡(jiǎn)介是推出的一個(gè)天挑戰(zhàn)。 深入 JavaScript,從對(duì)象開始 - 前端 - 掘金入坑前端開發(fā)有一段時(shí)間了,面對(duì)形形色色的JavaScript優(yōu)秀框架,到底該選擇那一款呢?最近在使用Vue.js寫一款markdown編輯器插...
摘要:專題系列共計(jì)篇,主要研究日常開發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實(shí)現(xiàn)模式需求我們需要寫一個(gè)函數(shù),輸入,返回。 JavaScript 專題之從零實(shí)現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實(shí)現(xiàn)一個(gè) jQuery 的 ext...
摘要:關(guān)于我的博客掘金專欄路易斯專欄原文鏈接深度長(zhǎng)文數(shù)組全解密全文共字,系統(tǒng)講解了數(shù)組的各種特性和。構(gòu)造器構(gòu)造器用于創(chuàng)建一個(gè)新的數(shù)組。中聲明的數(shù)組,它的構(gòu)造函數(shù)是中的對(duì)象。 本文首發(fā)于CSDN網(wǎng)站,下面的版本又經(jīng)過進(jìn)一步的修訂。 關(guān)于 我的博客:louis blog 掘金專欄:路易斯專欄 原文鏈接:【深度長(zhǎng)文】JavaScript數(shù)組全解密 全文共13k+字,系統(tǒng)講解了JavaScrip...
摘要:桶排序與計(jì)數(shù)排序的區(qū)別桶排序中一個(gè)桶可以放一個(gè)范圍內(nèi)的多個(gè)數(shù)據(jù),在各個(gè)桶中又可以用其他方法排序,其快速之處在于只用對(duì)比同一個(gè)桶內(nèi)的數(shù)字而無需與其他桶的數(shù)字作對(duì)比。與計(jì)數(shù)排序相比,桶排序需要作二次對(duì)比,但可省略桶的個(gè)數(shù)。 哈希表(Hash Table) 所有符合鍵值對(duì)即key-value的結(jié)構(gòu)就是哈希。數(shù)組其實(shí)也是一種哈希。 計(jì)數(shù)排序(復(fù)雜度(n+max))無法統(tǒng)計(jì)負(fù)數(shù)和小數(shù),需要一個(gè)...
閱讀 1280·2021-10-11 10:59
閱讀 2032·2021-09-29 09:44
閱讀 947·2021-09-01 10:32
閱讀 1495·2019-08-30 14:21
閱讀 1932·2019-08-29 15:39
閱讀 3038·2019-08-29 13:45
閱讀 3601·2019-08-29 13:27
閱讀 2071·2019-08-29 12:27