1. 程式人生 > >Javascript中判斷變數是 array還是object(是陣列還是物件)

Javascript中判斷變數是 array還是object(是陣列還是物件)

此段文字是從github上擷取由本人翻譯過來的。

原文地址:https://github.com/nathansmith/javascript-quiz/blob/master/ANSWERS.md

怎樣判斷一個JavaScript變數是array還是obiect?

答案:

1、如果你只是用typeof來檢查該變數,不論是array還是object,都將返回‘object’。

此問題的一個可行的答案是是檢查該變數是不是object,並且檢查該變數是否有數字長度(當為空array時長度也可能為0)。

然而,引數物件【arguments object】(傳給制定函式的所有引數),也可能會適用於上述方法,技術上來說,引數物件並不是一個array。

此外,當一個物件有a.length屬性的時候,這個方法也不成立。

// Real array 正在的陣列
var my_array = [];

// Imposter!  冒名頂替的!
var my_object = {};
my_object.length = 0;

// Potentially faulty 潛在的錯誤
function is_this_an_array(param) {
  if (typeof param === 'object' && !isNaN(param.length)) {
    console.log('Congrats, you have an array!');
  }
  else {
    console.log('Bummer, not an array');
  }
}

// Works 成功
is_this_an_array(my_array);

// Works, but is incorrect 成功了,但是不正確
is_this_an_array(my_object);


2、回答這個問題的另一個答案是用一個更加隱蔽的方法,呼叫toString( )方法試著將該變數轉化為代表其型別的string。

該方法對於真正的array可行;引數物件轉化為string時返回[object Arguments]會轉化失敗;此外,

對於含有數字長度屬性的object類也會轉化失敗。

// Real array 真正的陣列
var my_array = [];

// Imposter! 冒名頂替的!
var my_object = {};
my_object.length = 0;

// Rock solid 堅如磐石(檢驗函式)
function is_this_an_array(param) {
  if (Object.prototype.toString.call(param) === '[object Array]') {
    console.log('Congrats, you have an array!');
  }
  else {
    console.log('Bummer, not an array');
  }
}

// Works 成功了
is_this_an_array(my_array);

// Not an array, yay! 不是陣列(array)!
is_this_an_array(my_object);
3、此外,在可能不可靠的多框架DOM環境中,instanceof是個完美合適的操作。

擴充套件閱讀:"Instanceof Considered Harmful…"


var my_array = [];

if (my_array instanceof Array) {
  console.log('Congrats, you have an array!');
}
4、對於Javascript 1.8.5(ECMAScript 5),變數名字.isArray( )可以實現這個目的
var my_array = [];

if (Array.isArray(my_array)) {
  console.log('Congrats, you have an array!');
}