JavaScript Array.isArray() (判斷是否為陣列)

Array.isArray() 是一個靜態方法,用來判斷傳入的值是否為陣列 (array),回傳 truefalse

語法:

Array.isArray(value);

用法:

Array.isArray([1, 2, 3]); // true
Array.isArray([]); // true
Array.isArray(new Array()); // true
Array.isArray(new Array(5)); // true

Array.isArray('hello'); // false
Array.isArray(123); // false
Array.isArray({ length: 3 }); // false(類陣列物件不是陣列)
Array.isArray(null); // false
Array.isArray(undefined); // false

為什麼需要 Array.isArray()

因為 typeof 無法正確區分陣列和物件:

typeof []; // 'object'
typeof {}; // 'object'

// 無法區分!所以需要 Array.isArray()
Array.isArray([]); // true
Array.isArray({}); // false

比其他方法更可靠

使用 instanceof 在跨 frame/window 時會失效:

// 同一個 window 下沒問題
const arr = [1, 2, 3];
Array.isArray(arr); // true

// 檢查 iframe 裡面的 array
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
const iframeArr = iframe.contentWindow.someArray;
iframeArr instanceof Array; // 可能是 false!

// Array.isArray() 不會有這個問題
Array.isArray(iframeArr); // true

實際應用

function processData(data) {
  if (Array.isArray(data)) {
    // 如果是陣列,處理每個元素
    data.forEach(function (item) {
      console.log(item);
    });
  } else {
    // 不是陣列,直接處理
    console.log(data);
  }
}

processData([1, 2, 3]); // 輸出 1, 2, 3
processData('hello'); // 輸出 'hello'
// 確保參數是陣列
function sum(numbers) {
  if (!Array.isArray(numbers)) {
    throw new TypeError('參數必須是陣列');
  }

  return numbers.reduce(function (a, b) {
    return a + b;
  }, 0);
}
Array.isArray() 是 ES5 引入的方法,是判斷陣列最可靠的方式。