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