javascript Array 方法總結(jié)(搬運(yùn)的)

完整的原文地址請點(diǎn)擊:地址

數(shù)組原型提供的方法主要分為三種,會改變自身值的,不會改變自身值的,遍歷方法。

  • 改變自身值的方法(9個)

    基于ES6,改變自身值的方法一共有9個,分別為pop、push、reverse、shift、sort、splice、unshift,
    以及兩個ES6新增的方法copyWithinfill

    • pop
      pop() 方法刪除一個數(shù)組中的最后的一個元素,并且返回這個元素。如果是棧的話,這個過程就是棧頂彈出。
      語法:arr.pop()
    • push
      push()方法添加一個或者多個元素到數(shù)組末尾,并且返回數(shù)組新的長度。如果是棧的話,這個過程就是棧頂壓入。
      語法:arr.push(element1, ..., elementN)
    • reverse
      reverse()方法顛倒數(shù)組中元素的位置,第一個會成為最后一個,最后一個會成為第一個,該方法返回對數(shù)組的引用。
      語法:arr.reverse()
    • shift
      shift()方法刪除數(shù)組的第一個元素,并返回這個元素。
      語法:arr.shift()
    • sort
      sort()方法對數(shù)組元素進(jìn)行排序,并返回這個數(shù)組。
      語法:arr.sort()
      console.log(array === array.sort()) // true
    • splice
      splice()方法用新元素替換舊元素的方式來修改數(shù)組。
      splice是一個常用的方法,復(fù)雜的數(shù)組操作的場景通常都會有它的身影特別是需要維持原數(shù)組引用時,就地刪除或者新增元素,splice是最適合的。
      語法:arr.splice(start,deleteCount[, item1[, item2[, …]]])
      • start 指定從哪一位開始修改內(nèi)容。如果超過了數(shù)組長度,則從數(shù)組末尾開始添加內(nèi)容;如果是負(fù)值,則其指定的索引位置等同于 length+start (length為數(shù)組的長度),表示從數(shù)組末尾開始的第 -start 位。
      • deleteCount 指定要刪除的元素個數(shù),若等于0,則不刪除。這種情況下,至少應(yīng)該添加一位新元素,若大于start之后的元素總和,則start及之后的元素都將被刪除。
      • itemN 指定新增的元素,如果缺省,則該方法只刪除數(shù)組元素。
      • 返回值 由原數(shù)組中被刪除元素組成的數(shù)組,如果沒有刪除,則返回一個空數(shù)組。
    • unshift
      unshift() 方法用于在數(shù)組開始處插入一些元素(就像是棧底插入),并返回數(shù)組新的長度。
      語法:arr.unshift(element1, ..., elementN)
    • copyWithin
      copyWithin() 方法用于數(shù)組內(nèi)的元素替換,即替換元素和被替換元素均是數(shù)組內(nèi)的元素。
      語法:arr.copyWithin(target, start[, end = this.length])
      taget 指定被替換元素的索引,start 指定替換元素起始的索引,end 可選,指的是替換元素結(jié)束位置的索引。
      如果start為負(fù),則其指定的索引位置等同于length+start,length為數(shù)組的長度。end也是如此。
      注:目前只有Firefox(版本32及其以上版本)實現(xiàn)了該方法。
      var array = [1,2,3,4,5]; 
      var array2 = array.copyWithin(0,3);
      console.log(array===array2,array2); // true [4, 5, 3, 4, 5]
      
      var array = [1,2,3,4,5]; 
      console.log(array.copyWithin(0,3,4)); // [4, 2, 3, 4, 5]
      
      var array = [1,2,3,4,5]; 
      console.log(array.copyWithin(0,-2,-1)); // [4, 2, 3, 4, 5] 
      
    • fill
      fill() 方法同樣用于數(shù)組元素替換,它可將數(shù)組指定區(qū)間內(nèi)的元素替換為某個值。
      語法:arr.fill(value, start[, end = this.length])
      value 指定被替換的值,start 指定替換元素起始的索引,end 可選,指的是替換元素結(jié)束位置的索引。
      如果start為負(fù),則其指定的索引位置等同于length+start,length為數(shù)組的長度。end也是如此。
      var array = [1,2,3,4,5];
      var array2 = array.fill(10,0,3);
      console.log(array===array2,array2); // true [10, 10, 10, 4, 5], 可見數(shù)組區(qū)間[0,3]的元素全部替換為10
      
  • 不會改變自身的方法(9個)

    基于ES7,不會改變自身的方法一共有9個,分別為 concat、join、slice、toString、toLocateString、 indexOf、lastIndexOf、未標(biāo)準(zhǔn)的toSource 以及ES7新增的方法 includes。

    • concat
      concat() 方法將傳入的數(shù)組或者元素與原數(shù)組合并,組成一個新的數(shù)組并返回。
      語法:arr.concat(value1, value2, ..., valueN)

      var array = [1, 2, 3];
      var array2 = array.concat(4,[5,6],[7,8,9]);
      console.log(array2); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
      console.log(array); // [1, 2, 3], 可見原數(shù)組并未被修改
      
    • join
      join() 方法將數(shù)組中的所有元素連接成一個字符串。
      語法:arr.join([separator = ',']) separator可選,缺省默認(rèn)為逗號。

    • slice
      slice() 方法將數(shù)組中一部分元素淺復(fù)制存入新的數(shù)組對象,并且返回這個數(shù)組對象。
      語法:arr.slice(start[, end])
      參數(shù) start 指定復(fù)制開始位置的索引,end如果有值則表示復(fù)制結(jié)束位置的索引(不包括此位置)。
      淺復(fù)制 是指當(dāng)對象的被復(fù)制時,只是復(fù)制了對象的引用,指向的依然是同一個對象。

    • toString
      toString() 方法返回數(shù)組的字符串形式,該字符串由數(shù)組中的每個元素的 toString() 返回值經(jīng)調(diào)用 join() 方法連接(由逗號隔開)組成。
      語法: arr.toString()

    • toLocaleString
      toLocaleString() 類似toString()的變型,該字符串由數(shù)組中的每個元素的 toLocaleString() 返回值經(jīng)調(diào)用 join() 方法連接(由逗號隔開)組成。
      語法:arr.toLocaleString()
      數(shù)組中的元素將調(diào)用各自的 toLocaleString 方法:

    • indexOf
      indexOf() 方法用于查找元素在數(shù)組中第一次出現(xiàn)時的索引,如果沒有,則返回-1。
      語法:arr.indexOf(element, fromIndex=0)
      element 為需要查找的元素。
      fromIndex 為開始查找的位置,缺省默認(rèn)為0。如果超出數(shù)組長度,則返回-1。
      indexOf 使用嚴(yán)格相等(即使用 === 去匹配數(shù)組中的元素)。

    • lastIndexOf
      lastIndexOf() 方法用于查找元素在數(shù)組中最后一次出現(xiàn)時的索引,如果沒有,則返回-1。并且它是indexOf的逆向查找,即從數(shù)組最后一個往前查找。
      語法:arr.lastIndexOf(element, fromIndex=length-1)
      element 為需要查找的元素。
      fromIndex 為開始查找的位置,缺省默認(rèn)為數(shù)組長度length-1。如果超出數(shù)組長度,由于是逆向查找,則查找整個數(shù)組。
      同 indexOf 一樣,lastIndexOf 也是嚴(yán)格匹配數(shù)組元素。

    • includes
      includes() 方法基于ECMAScript 2016(ES7)規(guī)范,它用來判斷當(dāng)前數(shù)組是否包含某個指定的值,如果是,則返回 true,否則返回 false。
      語法:arr.includes(element, fromIndex=0)
      element 為需要查找的元素。
      fromIndex 表示從該索引位置開始查找 element,缺省為0,它是正向查找,即從索引處往數(shù)組末尾查找。

      var array = [1, 2, NaN];
      console.log(array.includes(1)); // true
      console.log(array.includes(NaN)); // true
      console.log(array.includes(2,-4)); // true
      
    • toSource
      toSource() 方法是非標(biāo)準(zhǔn)的,該方法返回數(shù)組的源代碼,目前只有 Firefox 實現(xiàn)了它。
      語法:arr.toSource()

  • 遍歷方法(12個)

    基于ES6,遍歷方法一共有12個,分別為forEach、every、some、filter、 map、reduce、reduceRight,
    以及ES6新增的方法entries、find、findIndex、keys、values。

    • forEach
      forEach() 方法指定數(shù)組的每項元素都執(zhí)行一次傳入的函數(shù),返回值為undefined。
      語法:arr.forEach(fn, thisArg)
      fn 表示在數(shù)組每一項上執(zhí)行的函數(shù),接受三個參數(shù):
      - value 當(dāng)前正在被處理的元素的值
      - index 當(dāng)前元素的數(shù)組索引
      - array 數(shù)組本身
      thisArg 可選,用來當(dāng)做 fn 函數(shù)內(nèi)的 this 對象。


      forEach 將為數(shù)組中每一項執(zhí)行一次 fn 函數(shù),那些 已刪除,新增或者從未賦值的項將被跳過(但不包括值為 undefined 的項)。


      遍歷過程中,fn會被傳入上述三個參數(shù)。

      var array = [1, 3, 5];
      var obj = {name:'cc'};
      var sReturn = array.forEach(function(value, index, array){
        array[index] = value * value;
        console.log(this.name); // cc被打印了三次
      },obj);
      console.log(array); // [1, 9, 25], 可見原數(shù)組改變了
      console.log(sReturn); // undefined, 可見返回值為undefined
      
    • every
      every() 方法使用傳入的函數(shù)測試所有元素,只要其中有一個函數(shù)返回值為 false,那么該方法的結(jié)果為 false;如果全部返回 true,那么該方法的結(jié)果才為 true。

       var array = [18, 9, 10, 35, 80];
       var array2 = array.every(function(value, index, array){
         return value > 20;
       });
       console.log(array2); //false
      
    • some
      some() 方法剛好同 every() 方法相反,some 測試數(shù)組元素時,只要有一個函數(shù)返回值為 true,則該方法返回 true,若全部返回 false,則該方法返回 false。

    • filter
      filter() 方法使用傳入的函數(shù)測試所有元素,并返回所有通過測試的元素組成的新數(shù)組。它就好比一個過濾器,篩掉不符合條件的元素。
      語法:arr.filter(fn, thisArg)

       var array = [18, 9, 10, 35, 80];
       var array2 = array.filter(function(value, index, array){
         return value > 20;
       });
       console.log(array2); // [35, 80]
      
    • map
      map() 方法遍歷數(shù)組,使用傳入函數(shù)處理每個元素,并返回函數(shù)的返回值組成的新數(shù)組。
      語法:arr.map(fn, thisArg)

       var str = '12345';
       var output = Array.prototype.map.call(str, function(x) {
         return x;
       }).reverse().join(' ');
       console.log(output);//5 4 3 2 1
      
    • reduce
      reduce() 方法接收一個方法作為累加器,數(shù)組中的每個值(從左至右) 開始合并,最終為一個值。
      語法:arr.reduce(fn, initialValue)
      fn 表示在數(shù)組每一項上執(zhí)行的函數(shù),接受四個參數(shù):

      • previousValue 上一次調(diào)用回調(diào)返回的值,或者是提供的初始值
      • value 數(shù)組中當(dāng)前被處理元素的值
      • index 當(dāng)前元素在數(shù)組中的索引
      • array 數(shù)組自身

      initialValue 指定第一次調(diào)用 fn 的第一個參數(shù)。

       var array = [1, 2, 3, 4];
       var s = array.reduce((p, v) => p * v,3); 
       console.log(s); //72
      
    • reduceRight
      reduceRight() 方法接收一個方法作為累加器,數(shù)組中的每個值(從右至左)開始合并,最終為一個值。除了與reduce執(zhí)行方向相反外,其他完全與其一致,請參考上述 reduce 方法介紹。

    • entries
      entries() 方法基于ECMAScript 2015(ES6)規(guī)范,返回一個數(shù)組迭代器對象,該對象包含數(shù)組中每個索引的鍵值對。
      語法:arr.entries()

      var array = ["a", "b", "c"];
      var iterator = array.entries();
      console.log(iterator.next().value); // [0, "a"]
      console.log(iterator.next().value); // [1, "b"]
      console.log(iterator.next().value); // [2, "c"]
      console.log(iterator.next().value); // undefined, 迭代器處于數(shù)組末尾時, 再迭代就會返回undefined
      
    • find&findIndex
      find() 方法基于ECMAScript 2015(ES6)規(guī)范,返回數(shù)組中第一個滿足條件的元素(如果有的話), 如果沒有,則返回undefined。
      findIndex() 方法則返回數(shù)組中第一個滿足條件的元素的索引(如果有的話)否則返回-1。
      語法:arr.find(fn, thisArg),arr.findIndex(fn, thisArg)

       var array = [1, 3, 5, 7, 8, 9, 10];
       function f(value, index, array){
         return value%2==0; // 返回偶數(shù)
       }
       function f2(value, index, array){
         return value > 20; // 返回大于20的數(shù)
       }
       console.log(array.find(f)); // 8
       console.log(array.find(f2)); // undefined
       console.log(array.findIndex(f)); // 4
       console.log(array.findIndex(f2)); // -1
      
    • keys
      keys() 方法基于ECMAScript 2015(ES6)規(guī)范,返回一個數(shù)組索引的迭代器。(瀏覽器實際實現(xiàn)可能會有調(diào)整)
      語法:arr.keys()

      var array = ["abc", "xyz"];
      var iterator = array.keys();
      console.log(iterator.next()); // Object {value: 0, done: false}
      console.log(iterator.next()); // Object {value: 1, done: false}
      console.log(iterator.next()); // Object {value: undefined, done: true}
      

      索引迭代器會包含那些沒有對應(yīng)元素的索引,如下:

      var array = ["abc", , "xyz"];
      var sparseKeys = Object.keys(array);
      var denseKeys = [...array.keys()];
      console.log(sparseKeys); // ["0", "2"]
      console.log(denseKeys);  // [0, 1, 2]
      

      利用keys實現(xiàn),生成一個從0到指定數(shù)字的新數(shù)組

      [...Array(10).keys()]; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      [...new Array(10).keys()]; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      
    • values
      values() 方法基于ECMAScript 2015(ES6)規(guī)范,返回一個數(shù)組迭代器對象,該對象包含數(shù)組中每個索引的值。其用法基本與上述 entries 方法一致。
      語法:arr.values()

      var array = ["abc", "xyz"];
      var iterator = array.values();//Array Iterator {}
      console.log(iterator.next().value); // abc
      console.log(iterator.next().value); // xyz
      
    • Symbol.iterator
      該方法基于ECMAScript 2015(ES6)規(guī)范,同 values 方法功能相同。
      語法:arr[Symbol.iterator] ()

      var array = ["abc", "xyz"];
      var iterator = array[Symbol.iterator]();
      console.log(iterator.next().value); // abc
      console.log(iterator.next().value); // xyz
      
  • ES6專門擴(kuò)展了數(shù)組構(gòu)造器Array ,新增2個方法:Array.of、Array.from
    • Array.of
      Array.of用于將參數(shù)依次轉(zhuǎn)化為數(shù)組中的一項,然后返回這個新數(shù)組,而不管這個參數(shù)是數(shù)字還是其它。它基本上與Array構(gòu)造器功能一致,唯一的區(qū)別就在單個數(shù)字參數(shù)的處理上。如下:

      Array.of(8.0); // [8]
      Array(8.0); // [undefined × 8]
      

      參數(shù)為多個,或單個參數(shù)不是數(shù)字時,Array.of 與 Array構(gòu)造器等同。

      Array.of(8.0, 5); // [8, 5]
      Array(8.0, 5); // [8, 5]
      
      Array.of('8'); // ["8"]
      Array('8'); // ["8"]
      

      若是需要使用數(shù)組包裹元素,推薦優(yōu)先使用Array.of方法。

    • Array.from
      Array.from的設(shè)計初衷是快速便捷的基于其他對象創(chuàng)建新數(shù)組,準(zhǔn)確來說就是從一個類似數(shù)組的可迭代對象創(chuàng)建一個新的數(shù)組實例,說人話就是,只要一個對象有迭代器,Array.from就能把它變成一個數(shù)組(當(dāng)然,是返回新的數(shù)組,不改變原對象)。
      語法:Array.from(arrayLike[, processingFn[, thisArg]])
      從語法上看,Array.from擁有3個形參,第一個為類似數(shù)組的對象,必選。第二個為加工函數(shù),新生成的數(shù)組會經(jīng)過該函數(shù)的加工再返回。第三個為this作用域,表示加工函數(shù)執(zhí)行時this的值。后兩個參數(shù)都是可選的。
      我們來看看用法。

      var obj = {0: 'a', 1: 'b', 2:'c', length: 3};
      let array = Array.from(obj, (value) => value.repeat(3));
      console.log(array)  //["aaa", "bbb", "ccc"]
      

      利用Array.from實現(xiàn),生成一個從0到指定數(shù)字的新數(shù)組

      Array.from({length: 10}, (v, i) => i); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      
    • Array.isArray

      Array.isArray([]); // true
      Array.isArray({0: 'a', length: 1}); // false
      

      通過Object.prototype.toString去判斷一個值的類型,也是各大主流庫的標(biāo)準(zhǔn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載:在開發(fā)中,數(shù)組的使用場景非常多,平日中也涉及到很多數(shù)組的api/相關(guān)操作,一直也沒有對這塊內(nèi)容進(jìn)行一塊整理總...
    七色煙火閱讀 3,399評論 0 3
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,567評論 0 13
  • --- 學(xué)習(xí)目標(biāo): - 掌握編程的基本思維 - 掌握編程的基本語法 typora-copy-images-to: ...
    YFBigHeart閱讀 1,125評論 0 2
  • 上一章 文|瑩瑩 不知道顧晨是什么時候走的,我收拾好心情出來,環(huán)顧四周,房間里空空蕩蕩的,才發(fā)現(xiàn)他已經(jīng)不在了。我看...
    瑩瑩in閱讀 880評論 1 23
  • 結(jié)論: 此地處于北半球靠海的低海拔中緯度陸地地區(qū)。氣候溫和,氣壓穩(wěn)定,夏天非常涼爽,冬季相對溫和不算太冷,空氣濕潤...
    犀寶閱讀 1,419評論 5 6

友情鏈接更多精彩內(nèi)容