判斷一個對象是否是數組的方法

( 1) typeof 沒法判斷 只能判斷原始類型的值和函數
 
 
(2)isPrototypeOf 判斷父及對象 可檢查整個原型鏈 //可能繼承自數組
 
 
console.log(Array.prototype.isPrototypeOf([])?"是數組":"不是數組");
 
console.log(Array.prototype.isPrototypeOf({})?"是數組":"不是數組");
console.log(Array.prototype.isPrototypeOf(function(){})?"是數組":"不是數組");
 
(3)constructor 檢查指定對象的構造函數 可檢查整個原型鏈 //可能繼承自數組
 
var father={};
var son={};
father.__proto__=Array.prototype;
son.__proto__=father;
console.log(son.contructor==Array?"是數組":"不是數組")
console.log({}.contructor==Array?"是數組":"不是數組");
console.log(function(){}.contructor==Array?"是數組":"不是數組");
 
(4)instanceof 檢查一個對象是不是制定構造函數的實例 可檢查整個原型鏈 //可能繼承自數組
var father={};
var son={};
father.__proto__=Array.prototype;
son.__proto__=father;
console.log(son instanceof Array?"是數組":"不是數組");
console.log({} instanceof Array?"是數組":"不是數組");
console.log(function(){} instanceof Array?"是數組":"不是數組");
 
 
(5)強行用要檢查的對象,調用原始的toString方法 不檢查整個原型鏈 //[object class]: class-Array Date Object //只能檢查最初就是數組建立的對象。
console.log(Object.prototype.toString.call([])=="[object Array]"?"是數組":"不是數組");
console.log(Object.prototype.toString.call({}));
console.log(Object.prototype.toString.call(function(){}));
console.log(Object.prototype.toString.call(/\d/));
var father={}; var son={};
father.__proto__=Array.prototype;
son.__proto__=father;
console.log(Object.prototype.toString.call(son)=="[object Array]"?"是數組":"不是數組");//不是 //結論: 對象一旦建立,class屬性就沒法修改 //修改繼承關係,也沒法修改class屬性
 
 
(6) Array.isArray(obj) 不檢查整個原型鏈
console.log(Array.isArray([]));
console.log(Array.isArray({}));
//若是瀏覽器不支持isArray
if(Array.prototype.isArray===undefined){//添加isArray方法
  Array.prototype.isArray=function(arg){ //強行調用原始toString方法,和"[object Array]"比較
    return Object.prototype.toString.call(arg) =="[object Array]"?"是數組":"不是數組";
  }
}
相關文章
相關標籤/搜索