Skip to content

类型判断

typeof

对null,以及引用类型中的数组、日期、正则没有返回自己的具体类型。简单的记就是只可以返回基本类型(null除外),function以及Object(null返回的也是Object)

  1. 对于基本类型,除null外,均可以返回正确的结果
  2. 对引用类型中的function 返回 function类型
  3. null以及其他引用类型 返回 object类型

instanceof

是用来判断 A 是否为 B 的实例,表达式为:A instanceof B。注意的是 instanceof 检测的是原型。instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型

js
;[] instanceof Object // true
;[] instanceof Array // true

模拟实现一个instanceof

js
function instance_of(Case, Constructor) {
  // 基本数据类型返回false
  // 兼容一下函数对象
  if ((typeof Case != 'object' && typeof Case != 'function') || Case == 'null')
    return false
  let CaseProto = Object.getPrototypeOf(Case)
  while (true) {
    // 查到原型链顶端,仍未查到,返回false
    if (CaseProto == null) return false
    // 找到相同的原型
    if (CaseProto === Constructor.prototype) return true
    CaseProto = Object.getPrototypeOf(CaseProto)
  }
}

constructor

可追溯的实例的构造器

js
function F() {}
var f = new F()
// f.constructor === F

Object.toString

toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。 对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

js
const typeofType = value => {
  const callType = Object.prototype.toString.call(value)
  return callType.slice(8, -1)
}