2011年12月24日 星期六

JavaScript 判斷變數是否為陣列的方法

JavaScript沒有內建判斷變數是否為陣列的方法,有的人會用instanceof來判斷,但在某些狀況,會無法正確判斷,所以較佳的判斷方式,還是另外寫一個function來判斷。

以下舉幾種判斷變數是否為陣列的方式,為了測試這幾種方式判斷的正確度,
先將要測試的方式寫成一個名稱為is_array的函式,
然後呼叫下面的function去測試判斷的結果。
function myTest(){
 alert(
 'undefined : ' + ((is_array(undefined)) ? 'true' : 'false') + "\n" //false
 + 'null : ' + ((is_array(null)) ? 'true' : 'false') + "\n" //false
 + 'true : ' + ((is_array(true)) ? 'true' : 'false') + "\n" //false
 + 'false : ' + ((is_array(false)) ? 'true' : 'false') + "\n" //false
 + '0 : ' + ((is_array(0)) ? 'true' : 'false') + "\n" //false
 + '\'\' : ' + ((is_array('')) ? 'true' : 'false') + "\n" //false
 + '1 : ' + ((is_array(1)) ? 'true' : 'false') + "\n" //false
 + 'A : ' + ((is_array('A')) ? 'true' : 'false') + "\n" //false
 + '{} : ' + ((is_array({})) ? 'true' : 'false') + "\n" //false
 + '[] : ' + ((is_array([])) ? 'true' : 'false') + "\n" //true
 + 'document.getElementById(\'frame1\').contentWindow.myArr : ' + ((is_array(document.getElementById('frame1').contentWindow.myArr)) ? 'true' : 'false') + "\n" //true
 //最後這個例子是抓iframe裡面的陣列,然後用自訂的is_array判斷是否為陣列
 );
}
因為myTest()最後一個情況是測試iframe裡面的陣列,所以要等iframe的頁面載入完後,才能抓到iframe頁面裡面的值。
HTML的部份如下。
<input onclick="myTest();" type="button" value="myTest" />
<iframe id="frame1" src="test.html"></iframe>
iframe的test.html內容如下
<script>
var myArr=[1,2];
</script>


再來就是自訂is_array這個函式了,下面舉幾種判斷方式。
方法1:
var is_array = function(v){
 return v instanceof Array;
}
測試結果如下圖:無法正確判斷iframe裡面的陣列



方法2:
var is_array = function(v){
 return !!v &&
 typeof v === 'object' &&
 v.constructor===Array;
}
測試結果如下圖:無法正確判斷iframe裡面的陣列



方法3:
var is_array = function(v){
 return !!v &&
 typeof v === 'object' &&
 typeof v.length === 'number' &&
 typeof v.splice === 'function' &&
 !(v.propertyIsEnumerable('length'));
}
測試結果如下圖:全部情形都可判斷



方法4:
var is_array = function(v){
 return Object.prototype.toString.call(v) === '[object Array]';
 //call也可改成用apply,效果一樣
 //return Object.prototype.toString.apply(v) === '[object Array]';
}
測試結果如下圖:全部情形都可判斷



結論:所以要判斷一個元素是不是陣列,可以用上面方法3或方法4的寫法,應該是比較準確的。

沒有留言:

張貼留言