推斷對象是不是為一個數組

推斷一個對象是否是數組範例

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 勉勵一下吧!

https://github.com/MLuminary/Blog/issues

    原文作者:Hutchins
    原文地址: https://segmentfault.com/a/1190000014797401
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞