推斷一個對象是否是數組範例
typeof
少部分人能夠起首會想到 typeof
var n = 3,
b = true,
s = 'Hello',
x = null,
y,
obj1 = function() {},
obj2 = {},
obj3 = [],
obj4 = new Date();
console.log(
typeof n, //number
typeof b, //boolean
typeof s, //string
typeof x, //object
typeof y, //undefined
typeof obj1, //function
typeof obj2, //object
typeof obj3, //object
typeof obj4 //object
);
能夠看出 typeof
是能夠推斷出基礎數據範例的,函數也能推斷出來,然則對象、數組、日期都邑返回 object,如許就基礎沒法推斷一個對象是否是數組範例。所以 typeof
宣布無計可施
推斷其父級原型對象
var obj1 = {},
obj2 = [1, 2, 3],
obj3 = new Date();
console.log(obj1.__proto__ == Array.prototype); //false
console.log(obj2.__proto__ == Array.prototype); //true
console.log(obj3.__proto__ == Array.prototype); //false
然則 __proto__
是內部屬性,本不應該被訪問到,我們能夠用 Object.getPrototypeOf(obj)
要領來替代他,雖然這個要領實在內部道理也是他,然則照樣有差別的。
console.log(Object.getPrototypeOf(obj1) == Array.prototype); //false
console.log(Object.getPrototypeOf(obj2) == Array.prototype); //true
console.log(Object.getPrototypeOf(obj3) == Array.prototype); //false
推斷其組織函數
obj instanceof Array
推斷 obj
是否是被組織函數 Array
製造出來的
console.log(obj1 instanceof Array); //false
console.log(obj2 instanceof Array); //true
console.log(obj3 instanceof Array); //false
但instanceof
不僅推斷直接父範例,而是一切在原型鏈上的範例,都返回 true
,所以假如你建立一個對象然則把他的 __proto__
指向 Array
的原型,然後推斷其範例,也會返回 true
。
obj1.__proto__ = Array.prototype;
console.log(obj1 instanceof Array); //true
推斷對象內部的 class 屬性
每一個對象內部,都有一個隱蔽的 class
屬性,紀錄該對象建立時的數據範例 class
屬性不會隨繼續關聯的轉變而轉變。(就相當於查人的 DNA 了吧,小樣還想假裝。)
這裡有一個題目:內置範例的原型對象中險些都重寫了新的 toString()
,只要最頂層的 toString()
才輸出對象的 class
屬性值,
因而我們能夠用 call
來運用最牛皮的身份判別
console.log(
Object.prototype.toString.call(obj1) == /*[object Object]*/ '[object Array]'
); //false
console.log(
Object.prototype.toString.call(obj2) == /*[object Array]*/ '[object Array]'
); //true
console.log(
Object.prototype.toString.call(obj3) == /*[object Date]*/ '[object Array]'
); //false
Array.isArray
Array.isArray
也能夠填補 typeof
的不足
Array.isArray(obj1); //false
Array.isArray(obj2); //true
Array.isArray(obj3); //false
更多文章來自我的 github ,求個 star 勉勵一下吧!