1. 程式人生 > >判斷一個物件是不是一個數組

判斷一個物件是不是一個數組

判斷一個物件是不是一個數組的方法:
1.驗證原型物件
如果一個物件的原型物件是Array.prototype

Object.getPrototypeOf(obj)==Array.prototype
var bool=father.isPrototypeOf(child)

var obj=[];
console.log(Array.prototype.isPrototypeOf(obj));//true

判斷father是否是child的父物件
2.驗證建構函式:
如果一個物件的建構函式是Array

obj.constructor==Array
Var bool=obj instanceof
Array var obj=[]; console.log(obj3 instanceof Array);//true

判斷obj是否是由建構函式Array創建出來
instance:例項:一個型別中的一個具體的物件
例項化:用new建立一個物件
問題:驗證不夠嚴格
只要是原型鏈上的都能夠排序,即使常見時不是使用陣列建立的,但是隻要原型鏈上有陣列型別,也認為是陣列。

var obj1={};
var obj2=[];
var obj3={};
obj3.__proto__=obj2;
console.log(obj3 instanceof Array);//true
console.log
(Array.prototype.isPrototypeOf(obj3));

在這裡插入圖片描述
3.檢查內部屬性class:
class是每個物件中記錄物件建立時使用的型別的屬性
一旦物件被建立,class屬性就無法被修改
如何獲得class:
唯一的方法:呼叫Object.prototype中的toString()
輸出結果:”[object Object]”
引用型別的物件 class
問題:幾乎所有內建物件的原型物件都重寫了object中的tostring方法 ,所有的內建物件的子物件,都無法直接調到Object的toString
解決:call(呼叫方法)幾乎無所不能
任意物件的任意方法.call(替換的方法)
什麼東西放在原型裡,什麼東西放在過載物件裡
內建物件的原型物件

var obj1={};
var obj2=[];
var obj3={};
obj3.__proto__=obj2;
//判斷物件的class屬性
console.log(Object.prototype.toString.call(obj2)=="[object Array]");//true
console.log(Object.prototype.toString.call(obj3)=="[object Array]");//false

在這裡插入圖片描述
4.isArray()和第三種都是嚴格的判斷 ES5新增原理就是第三種方法

var obj1={};
var obj2=[];
var obj3={};
obj3.__proto__=obj2;
//判斷物件的class屬性
console.log(Array.isArray(obj1));//false
console.log(Array.isArray(obj2));//true
console.log(Array.isArray(obj3));//false