JS数据类型之问——检测篇

428 阅读2分钟

typeof 是否能正确判断类型?

typeof 并不能够准确判断类型,对于基本数据类型来说,除了null之外,都能正确的显示类型

但是对于对象来说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能否判断基本数据类型?

这里在网上没找到合适的方法,借鉴学长的

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

这里的Symbol.hasInstance用于判断某对象是否为某构造器的实例,当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法。

学长说:“其实就是自定义instanceof行为的一种方式,这里将原有的instanceof方法重定义,换成了typeof,因此能够判断基本数据类型”

能不能手动实现一下instanceof的功能?

规则:

instanceof 用于判断某个对象是否是另一个对象(构造方法)的实例。instanceof会查找**原型链**,直到null如果还不是后面这个对象的实例的话就返回false,否则就返回true

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

//原型链的内容链接了掘金的讲解,看起来蛮不错的!