總結《JavaScriptt高級程序設計》中介紹判斷某個對象是否是數組的方法。
第一種方法:
使用instanceof操作符。instanceof操作符用來判斷要檢測對象的原型鏈上是否存在某個構造函數的prototype屬性。
語法: A instanceof B,意思是對象A的原型是否是B.prototype。如果是,返回true,如果不是,返回false。
1 var a={}; 2 var b=[]; 3 console.log(a instanceof Object);//true 4 console.log(b instanceof Array);//true
使用instanceof操作符有一個問題就是,它假定只有一個全局作用域。如果一個網頁中有多個框架(iframe元素),那實際上就存在兩個以上不同的全局執行環境,從而存在兩個以上不同版本的Array構造函數。如果你從一個框架向另一個框架傳入一個數組,那么傳入的數組與在第二個框架中原生創建的數組分別具有各自不同的構造函數。傳入的數組在該框架中用instanceof操作符判斷就會返回false。代碼如下:
1 var a={}; 2 var b=[]; 3 console.log(a instanceof Object);//true 4 console.log(b instanceof Array);//true 5 6 var frame=document.createElement("iframe");//創建一個框架 7 document.body.appendChild(frame); 8 var c=window.frames[0].Array;//取得框架全局執行環境中的Array構造函數 9 var d=new c();//在框架全局執行環境中創建一個數組d 10 console.log(d instanceof Array);//在當前頁面的執行環境中用instanceof操作符判斷d是否為數組,返回false 11 console.log(Array.isArray(d));//true
第二種方法:
使用ECMAScript 5新增的Array.isArray()方法。這個方法的作用就是確定某個值到底是不是數組,而不管它到底是在哪個全局執行環境中創建的。
第三種方法:
使用使用Object.prototype上的原生toString()方法判斷。
使用方法如下:
1 var a={}; 2 var b=[]; 3 var frame=document.createElement("iframe");//創建一個框架 4 document.body.appendChild(frame); 5 var c=window.frames[0].Array;//取得框架全局執行環境中的Array構造函數 6 var d=new c();//在框架全局執行環境中創建一個數組d 7 console.log(Object.prototype.toString.call(a));//[object Object] 8 console.log(Object.prototype.toString.call(b));//[object Array] 9 console.log(Object.prototype.toString.call(d));//[object Array] 10 11 function Person() { 12 this.name=name; 13 } 14 var n=new Person(); 15 console.log(Object.prototype.toString.call(n));//[object Object]
參考:
1、js如何判斷一個對象是不是Array? http://www.nowamagic.net/librarys/veda/detail/1250
2、JavaScript中toStirng()與Object.prototype.toString.call()方法淺談 http://www.zhufengpeixun.cn/JavaScriptmianshiti/2014-02-28/271.html
3、JavaScript:Object.prototype.toString方法的原理 http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html