在我們平時的工作中經常會用到如何判斷一個變量是否為數組。常用的方法很多,有用常用框架里面的,isArray。但是關於這個isArray的實現,各有不同。
常用的方法有如下幾種 #
1、instanceof
這個操作符和JavaScript中面向對象有點關系,了解這個就先得了解JavaScript中的面向對象。
因為這個操作符是檢測對象的原型鏈是否指向構造函數的prototype對象的。
function isArray (obj) {
return obj instanceof Array;
}
instanceof操作符的問題在於,它假定只有一個全局執行環境。如果網頁中包含多個框架,那實際上就存在2個以上不同的全局執行環境,從而存在2個以上不同版本的Array構造函數
如果你從一個框架向另一個框架傳人一個數組,那么傳人的數組與在第二個框架中原生創建的數組分別具有各自不同的構造函數。
為解決這個問題,ES5 新增了Array.isArray()方法
2.對象的constructor屬性
除了instanceof,每個對象還有constructor的屬性,利用它似乎也能進行Array的判斷。
var arr = [1,2,3,1];
alert(arr.constructor === Array); // true
第1種和第2種方法貌似無懈可擊,但是實際上還是有些漏洞的,當你在多個frame中來回穿梭的時候,這兩種方法就亞歷山大了。
由於每個iframe都有一套自己的執行環境,跨frame實例化的對象彼此是不共享原型鏈的,因此導致上述檢測代碼失效!
var iframe = document.createElement('iframe'); //創建iframe
document.body.appendChild(iframe); //添加到body中
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray(1,2,3); // 聲明數組[1,2,3]
alert(arr instanceof Array); // false
alert(arr.constructor === Array); // false
3、Object.prototype.toString
function isArray (obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
4、Array對象的 isArray方法( Array.isArray() )
ECMAScript5將Array.isArray()正式引入JavaScript,目的就是准確地檢測一個值是否為數組。
IE9+、 Firefox 4+、Safari 5+、Opera 10.5+和Chrome都實現了這個方法。但是在IE8之前的版本是不支持的。
function isArray (obj) {
return Array.isArray(obj);
}
//var arr = [1,2,3,1];
//alert(arr instanceof Array); // true
綜合上面的幾種方法,有一個當前的判斷數組的最佳寫法:
var arr = [1,2,3,1];
var arr2 = [{ abac : 1, abc : 2 }];
function isArrayFn(value){
if (typeof Array.isArray === "function") {
return Array.isArray(value);
}else{
return Object.prototype.toString.call(value) === "[object Array]";
}
}
alert(isArrayFn(arr));// true
alert(isArrayFn(arr2));// true
5.擴展(typeof)
javascript的typeof返回哪些數據類型.
答案:string,boolean,number,undefined,function,object
[JS高級程序設計72頁]
用來檢測基本數據類型,undefined、string、number、boolean
缺陷:分辨不了object引用類型種類,可用 instanceof 彌補
typeof null; //object
typeof Array; //object
typeof RegExp; //function ,ie,火狐object
typeof 函數; //function
