Javascript陣列詳解

weixin_34253539發表於2016-07-18

陣列的定義

陣列是按序號排列的一組值,每個值的位置都有編號(從0開始)。陣列本質上是一種特殊的物件。它的鍵名是按(0,1,2...)排列的一組數字。

  1. 建立陣列:

    var arr = new Array(values);
    var arr = [vaules];
  2. 判斷比是否是個陣列

    • Array.isArray(arr)

    • arr instanceof Array

  3. 取陣列元素
    arr[index]

  4. length 屬性
    返回陣列的成員數量。
    Javascript使用一個32位整數,儲存陣列的元素個數。這意味著陣列的成員最多隻有4294967295個。

    var arr = ['a','b'];
    arr.length  // 2
    arr.[10] = 'c'
    arr.length //11

    從上面的輸出結果可以看出,length屬性可以動態變化,如果將length屬性設為 0 ,就會將陣列清空。如果設定的數小於原有的個數,那麼在這個數後面的數值就自動刪除了。反過來,如果設定的數大於原有的個數,陣列的成員將增大,都為 undefined

    var a = [1,2];
    a.length = 5;
    a[4] // undefined
    a.length = 1;
    a.[1] // undefined
    a.length = 0;
    a  //[]
  5. 增加陣列元素

    • push()方法 在陣列的末尾增加一個或多個元素,並返回陣列的新長度。

    • unshift()方法 在陣列的開頭增加一個或多個元素,並返回陣列的新長度。

    • length 屬性

      var arr = [1, 2, 3]
      arr.push(4)
      arr  // 1, 2, 3, 4
      arr.unshift(6)
      arr  // 6, 1, 2, 3, 4
      arr[arr.length] = 7  // 與push()方法類似
      arr  // 6, 1, 2, 3, 4, 7
  6. 刪除陣列中的元素

    • delete 運算子,可以刪除陣列中的某個元素,但這不會改變length屬性的值.

    • pop() 方法 刪除陣列的最後一個元素,並返回這個元素。

    • shift() 方法 刪除陣列的第一個元素,並返回這個元素。

      var arr = [1,2,3];
      delete arr[0];
      arr   // [undefined,2,3]
      arr.length  // 3
      var last = arr.pop()
      var first = arr.shift()
      last // 3
      first // undefined
      arr //2

類陣列物件

在js中,有些物件被叫做“類陣列物件”(array-like object),因為這些物件看起來很像陣列,可以使用length屬性,但是無法使用陣列的方法。
典型的類陣列物件是函式的arguments物件,以及大多數DOM元素集,還有字串。

// arguments物件
function args() {return arguments; }
var arraylike = args('a','b')
arrayLike[0]  // 'a'
arrayLike.length // 2
arrayLike instanceof Array // false
Array.isArray(arrayLike)  // false

// DOM元素集
var elts = document.getElementsByTagName('p');
elts.length  // 3
eles instanceof Array  // false

//字串
'abc'[1]  // 'b'
'abc'.length  // 3
'abc' instanceof Array  // false

陣列的slice方法能將類陣列物件,變成真正的陣列。slice方法後面會結介紹。

var arr = Array.prototype.slice.call(arrayLike);

陣列的遍歷

  1. for...in 迴圈

    var a =[1, 2, 3];
    a.other = 'other';
    for (var i in arr){
        console.log( arr[i]);
    }
    // 1, 2, 3, other

    從上面的輸出結果可以看出,利用for..in迴圈會將動態新增的非數字鍵的值遍歷出來,因此需要使用的時候需要注意。

  2. for 迴圈和 while 迴圈

    var a = [1, 2, 3];
    
    // for迴圈
    for(var i = 0; i < a.length; i++) {
      console.log(a[i]);
    }
    
    // while迴圈
    var i = 0;
    while (i < a.length) {
      console.log(a[i]);
      i++;
    }
    
    var l = a.length;
    while (l--) {
      console.log(a[l]);
    }
  3. forEach()方法

    //array.forEach(callback[, thisArg])
    //callback 在陣列的每一項上執行的函式,接受三個引數:item: 陣列當前項的值,index: 當前項的索引,arr:陣列本身。
    var arr = [1, 2, 3]
    arr.forEach(function(item, index, arr){
        console.log(item, index);
    });
    //1 0
    //2 1
    //3 2

陣列常用的方法

陣列常用的方法

  1. join() 將數值轉換為字串

    var arr = [1, 2, 3];
    arr.join(); // "1,2,3"
    arr.join("_"); // "1_2_3"
  2. reverse() 將陣列逆序

    // 原陣列會被修改
    var arr = [1, 2, 3];
    arr.reverse(); // [3, 2, 1]
    arr; // [3, 2, 1]
  3. sort() 陣列排序
    預設情況下是升序排列的,底層是呼叫了每個陣列項的 toString() 方法,然後比較得到字串,即使每個陣列項的數值是數字,比較的也是字串。

    // 原陣列會被修改
    var arr = [1, 12, 213, 1432, 'a'];
    arr.sort(); // [1, 12, 1432, 213, "a"]
    arr.sort(function(a, b){
        return b-a; //按倒序排列陣列
    });
    
  4. concat() 陣列合並
    用法:array.concat(value1, value2, ..., valueN)

    // 原陣列不會被修改
    var arr =[1, 2, 3]
    arr.concat(4, 5);
    arr; //[1, 2, 3]
    arr.concat([11,2],3); // [1, 2, 3, 11, 2, 3]
  5. slice() 返回部分陣列
    用法:array.slice(begin[,end])

    slice用於複製陣列,複製完後舊陣列不變,返回得到的新陣列是舊陣列的子集。

    第一個引數begin是開始複製的位置,需要注意的是,可以設負數。設負數表示從尾往前數幾個位置開始複製。例如slice(-2)將從倒數第2個元素開始複製。另外需要注意的是,該引數雖未標註為可選,但實際上是可以省略的,省略的話預設為0。

    第二個引數end可選,表示複製到該位置的前一個元素。例如slice(0,3)將得到前3個元素,但不包含第4個元素。不設的話預設複製到陣列尾,即等於array.length。

    //原陣列不會被修改
    var arr = [1, 2, 3, 4, 5];
    arr.slice(); //[1, 2, 3, 4, 5]
    arr.slice(1,3); // [2, 3]
    arr.slice(1, -1); // [2, 3, 4]
    arr; // [1, 2, 3, 4, 5]
  6. splice() 陣列拼接
    用法:array.splice(start, deleteCount[, item1[, item2[, ...]]])

    • start 指要從哪一位開始修改內容,如果超出了陣列的長度,則從陣列末尾開始新增內容;如果是負值,則表示從陣列末位開始的第幾位。

    • deleteCount 表示要移除的陣列元素的個數

    • item 要新增進陣列的元素

    最主要的的用途是向陣列的中部插入元素。

    //原陣列會被修改
    var arr = [1, 2, 3, 4, 5];
    //從第三個陣列元素刪除
    arr.splice(2); // returns [3, 4, 5] 
    arr; // [1, 2]
    //從第三個陣列元素刪除,刪除兩個元素
    arr.splice(2, 2) // returns [3, 4]
    arr; // [1, 2, 5]
    //將'a','b'替換到陣列的第二個元素
    arr.splice(1, 1, 'a', 'b')
    
  7. forEach() 陣列遍歷
    用法:array.forEach(callback[, thisArg])
    callback 在陣列的每一項上執行的函式,接受三個引數:item:陣列當前項的值,index: 當前項的索引,arr:陣列本身。

    var arr = [1, 2, 3]
    arr.forEach(function(item, index, arr){
        console.log(item, index);
    });
    //1 0
    //2 1
    //3 2
  8. map() 陣列對映
    map對映建立新陣列,用法: map(function(value, index, array) { … }, [thisArg] );。和forEach一樣,不贅述。唯一需要注意的的是回撥函式需要有return值,否則新陣列都是undefined。

    其實map能幹的事forEach都能幹,你可以把map理解為forEach的一個特例,專門用於:通過現有的陣列建立新陣列。

    //原陣列未被修改
    var arr= [1, 2, 3];
    arr.map(function(x){
        return x+10;  // 需要 return 值,否則新陣列裡都是 undefined
    });  // [11, 12, 13]
    arr; // [1, 2, 3]
  9. filter() 陣列過濾
    filter用於過濾陣列,用法: filter( function(value, index, array) { … }, [thisArg] ); 。唯一需要注意的的是回撥函式需要return布林值true或false,

    //原陣列未被修改
    var arr= [1, 2, 3, 4, 5, 6, 7, 8];
    arr.filter(function(x,index){
        return x%2 == 0;
    }); // [2, 4, 6, 8]
    arr; // [1, 2, 3, 4, 5, 6, 7, 8]
  10. every() some() 陣列判斷
    some表示只要某一個滿足條件就OK,every表示全部滿足條件才OK。
    用法:

    • arr.every(callback[, thisArg])

    • arr.some(callback[,thisArg])

      var arr= [1, 2, 3, 4, 5];
      arr.every(function(x){
          return x < 6;
      }); // true
      arr.every(function(x){
          return x > 6;
      }); // false
      arr.some(function(x){
          return x === 1;
      });  // true
      arr.some(function(x){
          return x === 6;
      }); // false
  11. reduce() reduceRight()
    reduce() 方法接收一個函式作為累加器(accumulator),陣列中的每個值(從左到右)開始合併,最終為一個值。 兩者都是用於迭代運算。區別是reduce從頭開始迭代,reduceRight從尾開始迭代。

    用法: reduce( function(previousValue, currentValue, currentIndex, array) { … }, [initialValue] );

    第一個引數是回撥函式,有4個引數:previousValue,currentValue,currentIndex,array。看名字也能知道意思:前一個值,當前值,當前索引,陣列本身。

    第二個引數initialValue可選,表示初始值。如果省略,初始值為陣列的第一個元素,這樣的話回撥函式裡previousValue就是第一個元素,currentValue是第二個元素。因此不設initialValue的話,會少一次迭代。

    //將陣列所有項相加
    var arr = [0, 1, 2, 3];
    var sum = arr.reduce(function(a, b) {
     return a + b
    }, 0); // 6
    arr; //[0, 1, 2, 3]
    //陣列扁平化
    var flattened = [[0, 1], [2, 3], [4, 5]];
    flattened.reduce(function(a,b){
        return a.concat(b);
    }); // returns [0, 1, 2, 3, 4, 5]
  12. indexOf() lastIndexOf() 陣列檢索
    用法:indexOf( searchElement, [fromIndex = 0]) / lastIndexOf( searchElement , [fromIndex = arr.length – 1])
    第一個引數searchElement即需要查詢的元素。第二個引數fromIndex可選,指定開始查詢的位置。如果忽略,indexOf預設是0,lastIndexOf預設是陣列尾。
    兩者都用於返回專案的索引值。區別是indexOf從頭開始找,lastIndexOf從尾開始找。如果查詢失敗,無匹配,返回-1

    var arr = ['a', 'b', 'c', 'd', 'e'];
    arr.indexOf('c');  // 2 找到返回陣列下標
    arr.indexOf('c', 3); // -1 指定從3號位開始查詢
    arr.indexOf('f'); // -1 沒找到該元素
    arr.lastIndexOf('c'); // 2
    arr.lastIndexOf('c',2); // 2
    arr.lastIndexOf('f'); // -1 沒找到該元素
  13. isArray() 判斷是否是陣列
    用法:Array.isArray(value)

    var arr = [];
    var a = "not array";
    Array.isArray(arr); // true
    Array.isArray(a); // false

參考資料

MDN

相關文章