13、✅ 手写 instanceof、typeof、Object.prototype.toString,搞清 JS 类型判断机制

🎯 一、为什么要掌握这三种类型判断?

在开发和面试中你一定遇到过:

判断方式 优点 缺点
typeof 快速判断原始类型 对对象不准,如 typeof null === 'object'
instanceof 判断引用类型关系 对基本类型无效,跨 iframe 不准
Object.prototype.toString.call 最精确的方式 写法繁琐,需背模板

掌握这些是 JS 基础能力的核心体现,也是面试官常考点。


📌 二、类型判断原理总览

方法 原理 常见用途
typeof 内部通过 typeof 操作符返回固定字符串 判断基本类型
instanceof 判断 原型链 上是否存在构造函数的 prototype 判断对象与类的继承关系
toString.call() 利用对象内部的 [[Class]] 判断所有对象准确类型

✍️ 三、手写 instanceof

我们已在第 3 篇中写过,这里复习:

ini 复制代码
function myInstanceof(obj, Constructor) {
  if (obj == null || typeof obj !== 'object') return false;

  let proto = Object.getPrototypeOf(obj);
  const prototype = Constructor.prototype;

  while (proto) {
    if (proto === prototype) return true;
    proto = Object.getPrototypeOf(proto);
  }

  return false;
}

✅ 四、手写 typeof(本质:操作符,不可完全重写)

typeof 是语言级别保留的操作符,不能被完全手写模拟,但可以封装一个更强的类型判断函数来补足它的不足:

javascript 复制代码
function getType(val) {
  return typeof val === 'object'
    ? val === null
      ? 'null'
      : Object.prototype.toString.call(val).slice(8, -1).toLowerCase()
    : typeof val;
}

✅ 示例:

scss 复制代码
getType(123); // 'number'
getType(null); // 'null'
getType([]); // 'array'
getType(() => {}); // 'function'
getType(Symbol('x')); // 'symbol'

✍️ 五、手写 Object.prototype.toString.call 封装

javascript 复制代码
function toRawType(val) {
  return Object.prototype.toString.call(val).slice(8, -1); // 输出大写首字母格式:Array/Object/Date...
}

示例:

scss 复制代码
toRawType([]); // "Array"
toRawType(null); // "Null"
toRawType(new Date()); // "Date"
toRawType(/\d+/); // "RegExp"

🧠 六、对比总结(面试必背)

方法 可判断基本类型 可判断对象类型 可判断数组 能准确区分 null 跨 iframe 准确性
typeof ❌ (typeof null === 'object')
instanceof ❌(不同 iframe 的 Array/Function 不一样)
Object.prototype.toString.call
相关推荐
WindfallSheng12 分钟前
从Vibe Coding到Spec Coding:一套可落地的AI-SDD企业级研发实战工程
javascript·vue.js
Asize14 分钟前
Agent 入门:从 LLM 与 Agent 的区别到 Function Calling
javascript·人工智能
申君健248641827720220 分钟前
Vapor 核心数据结构:Block原理
前端
Csvn29 分钟前
工程化专题 | 改完组件保存,浏览器毫无反应,重启 dev server 又好了——气不气?
前端
我有满天星辰1 小时前
Vue 指令完全指南:从 Vue 2 到 Vue 3 的演进与实战
前端·javascript·vue.js
光影少年1 小时前
RN 渲染原理:不依赖WebView,原生控件渲染
前端·react native·react.js·前端框架
小白学过的代码1 小时前
# flv.js / mpegts.js 播不了国标摄像头(H.265 + G.711A)?纯前端 Jessibuca 无后端方案(附完整代码)
前端·javascript·h.265
console.log('npc')1 小时前
AI Agent 前端流式渲染核心技术文档(SSE \+ WebSocket \+ 打字机渲染)
前端·人工智能·websocket
法外狂徒11 小时前
将 Pi Agent 接入 HagiCode 的实践之路
服务器·前端·人工智能
IT_陈寒1 小时前
React中useEffect的依赖项把我坑惨了
前端·人工智能·后端