JS數據類型之問——檢測篇

typeof 是否能正確判斷類型?

typeof 並不可以準確判斷類型,對於基本數據類型來講,除了null以外,都能正確的顯示類型 bash

可是對於 對象來講typeof不能準確判斷類型,typeof 函數會返回 function,除此以外所有都是 object,不能準確判斷類型

console.log(typeof '');//string
console.log(typeof []);//object
console.log(typeof {});//object
console.log(typeof 1);//number
console.log(typeof null);//object
console.log(typeof undefined);//undefined
console.log(typeof true);//boolean
console.log(typeof function(){});//function
console.log(typeof /\d/);//object
複製代碼

因此判斷對象數據類型時不該該用typeof,而應該用instanceofinstanceof是基於原型鏈判斷對象的,能夠判斷複雜的對象函數

console.log([] instanceof Array);//true
console.log({} instanceof Object);//true
console.log(/\d/ instanceof RegExp);//true
console.log(function(){} instanceof Object);//true
console.log(function(){} instanceof Function);//true
複製代碼

instanceof可否判斷基本數據類型?

這裏在網上沒找到合適的方法,借鑑學長的post

class PrimitiveNumber {
  static [Symbol.hasInstance](x) {
    return typeof x === 'number'
  }
}
console.log(111 instanceof PrimitiveNumber) // true
複製代碼

這裏的Symbol.hasInstance用於判斷某對象是否爲某構造器的實例,當其餘對象使用instanceof運算符,判斷是否爲該對象的實例時,會調用這個方法。ui

學長說:「其實就是自定義instanceof行爲的一種方式,這裏將原有的instanceof方法重定義,換成了typeof,所以可以判斷基本數據類型」spa

能不能手動實現一下instanceof的功能?

規則:prototype

instanceof 用於判斷某個對象是不是另外一個對象(構造方法)的實例。instanceof會查找**原型鏈**,直到null若是還不是後面這個對象的實例的話就返回false,不然就返回true3d

function instanceofFunc(obj, cons) {
  // 錯誤判斷 構造函數必須是一個function 其餘的均報錯
  if (typeof cons !== 'function') throw new Error('instance error')
  if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) return false
  // 獲取到原型對象
  let proto = cons.prototype
  // 若是obj的原型對象不是null
  while (obj.__proto__) {
    if (obj.__proto__ === proto) return true
    obj = obj.__proto__
  }
  return false
}
console.log(instanceofFunc(() => {}, Function)) // true
複製代碼

//原型鏈的內容連接了掘金的講解,看起來蠻不錯的!code

相關文章
相關標籤/搜索