以下舉幾種判斷變數是否為陣列的方式,為了測試這幾種方式判斷的正確度,
先將要測試的方式寫成一個名稱為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的寫法,應該是比較準確的。
沒有留言:
張貼留言