成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JavaScript中數(shù)組排序深度講解

xbynet / 3464人閱讀

摘要:結(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ì)象內(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ǔ)句

ES6中新增加了一種:

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ì)是寫起來比較繁瑣,需要定義額外更多的變量,所以一下是針對(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.forEach

Example

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)的例子供大家參考理解:
Example

Array.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)例子供大家參考:
Example

Array.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)例子供大家參考:
Example

Array.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

小結(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)。

循環(huán)語(yǔ)句for...in

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è)置不可枚舉的屬性的除外)。
Example

var 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

相關(guān)文章

  • JavasScript重難點(diǎn)知識(shí)

    摘要:忍者級(jí)別的函數(shù)操作對(duì)于什么是匿名函數(shù),這里就不做過多介紹了。我們需要知道的是,對(duì)于而言,匿名函數(shù)是一個(gè)很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個(gè)供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果...

    forsigner 評(píng)論0 收藏0
  • js進(jìn)階 - 收藏集 - 掘金

    摘要:很多人可能誤認(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編輯器插...

    qqlcbb 評(píng)論0 收藏0
  • JavaScript專題系列文章

    摘要:專題系列共計(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...

    Maxiye 評(píng)論0 收藏0
  • 深度長(zhǎng)文】JavaScript數(shù)組所有API全解密

    摘要:關(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...

    Mr_zhang 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)以及相關(guān)排序

    摘要:桶排序與計(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è)...

    Brenner 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<