【前端面试小册】JS-第4节:typeof 与 instanceof 的区别与实战

第4节:typeof 与 instanceof 的区别与实战

一、为什么要区分(问题)

在实际开发和面试中,经常需要“准确判断类型”。常见工具是 typeofinstanceof,但它们侧重点不同,各自有局限。

  • 目标:快速、准确地选择合适的类型判断手段。

二、typeof(原理与示例)

typeof 用于判断基本类型和函数,返回字符串。

console.log(typeof 1);           // 'number'
console.log(typeof 'x');         // 'string'
console.log(typeof true);        // 'boolean'
console.log(typeof undefined);   // 'undefined'
console.log(typeof Symbol());    // 'symbol'
console.log(typeof BigInt(1));   // 'bigint'
console.log(typeof function(){});// 'function'

局限:无法区分引用类型(数组、对象、正则、日期等),并且 null 会被判为 'object'(历史遗留)。

console.log(typeof {});      // 'object'
console.log(typeof []);      // 'object'
console.log(typeof /x/);     // 'object'
console.log(typeof null);    // 'object'  // 易错点

原理简述:底层以若干位标识类型;null 的 bit 模式与对象同源,导致历史遗留返回 'object'

三、instanceof(原理与示例)

instanceof 用于判断某对象的原型链上是否出现过构造函数的 prototype

function Person() {}
function Child() {}
Child.prototype = new Person();

const c = new Child();
console.log(c instanceof Child);  // true
console.log(c instanceof Person); // true
console.log([] instanceof Array); // true
console.log([] instanceof Object);// true

局限:

  • 基本类型字面量判断有误(如 'x' instanceof String // false)。
  • 跨 iframe/realm 失效(不同全局对象拥有不同的内建构造函数)。

四、自实现 myInstanceof(示例)

function myInstanceof(left, right) {
  if (left == null || (typeof left !== 'object' && typeof left !== 'function')) return false;
  if (typeof right !== 'function') throw new TypeError('Right-hand side must be a function');
  let proto = Object.getPrototypeOf(left);
  const prototype = right.prototype;
  while (proto) {
    if (proto === prototype) return true;
    proto = Object.getPrototypeOf(proto);
  }
  return false;
}

五、三种方案对比(表格)

方案 适用范围 优点 局限 典型用法
typeof 基本类型、函数 简单、快速 无法区分 Array/Object,null 为 object 判断 primitive、函数
instanceof 引用类型 能基于原型链区分类型 基本类型无效、跨 iframe 失效 判断自定义类、内建对象实例
Object.prototype.toString.call 全类型 精确、稳定 语法冗长 通用型、库内实现
const getType = (v) => Object.prototype.toString.call(v).match(/\s+(\w+)/)[1];

六、实战建议(最佳实践)

  • 判断数组:Array.isArray(value)(内部也等价于 toString 判定)。
  • 判断纯对象:value !== null && typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype
  • 判断类实例:优先 instanceof;跨上下文(iframe)场景退回 toString 或特征检测。
  • 判断 null:直接 value === null
  • 判断 NaN:Number.isNaN(value)

七、流程图(如何选择)

flowchart TD
  A[需要判断类型] --> B{是否为 null/undefined}
  B -- 是 --> C[直接比较 value === null/undefined]
  B -- 否 --> D{是否判断数组}
  D -- 是 --> E[Array.isArray]
  D -- 否 --> F{是否判断类实例}
  F -- 是 --> G[instanceof]
  F -- 否 --> H{是否判断基本类型}
  H -- 是 --> I[typeof]
  H -- 否 --> J[Object.prototype.toString.call]

八、面试高频题

  1. typeof null === 'object' 的原因?
  2. 为什么 [] instanceof Objecttrue
  3. 跨 iframe/realm 如何可靠判断数组?
  4. 实现一个 instanceof 的 polyfill。

九、小结

  • typeof:判断基本类型与函数。
  • instanceof:判断引用类型基于原型链归属。
  • Object.prototype.toString.call:最稳健的通用方案;工程中建议封装 getType 工具。
#前端面试#
前端面试小册 文章被收录于专栏

每天更新3-4节,持续更新中... 目标:50天学完,上岸银行总行!

全部评论

相关推荐

2025-12-12 16:40
已编辑
广东外语外贸大学 后端工程师
岗位职责: 1.负责Web服务端的设计、开发和维护,确保系统的高性能、高可用性和可扩展性。2.参与需求分析、技术方案设计、代码编写和单元测试,确保代码质量和系统稳定性。3.优化现有系统的性能,解决系统中的技术难题,提升系统的响应速度和处理能力。4.负责与前端开发团队协作,定义API接口,确保前后端数据交互的高效性和安全性。5.参与系统架构设计,提出合理的解决方案,确保系统的可扩展性和可维护性。6.负责编写技术文档,包括设计文档、接口文档等,确保团队内部的技术沟通顺畅。7.跟踪并研究最新的Web服务端技术,持续优化现有系统,提升团队的技术水平。任职要求:1.学历要求: 计算机科学、软件工程或相关专业本科及以上学历。2.工作经验: 2年以上Web服务端开发经验,有高并发系统开发经验者优先。3.技术栈要求:熟练使用 PHP ,Golang。熟悉常用的Web框架,如gin、yiic 、lavarel等。熟悉RESTful API设计,具备良好的接口设计能力。熟悉数据库设计及优化,熟练使用MySQL、等数据库。熟悉缓存技术,如Redis、Memcached等。熟悉消息队列技术,如Kafka、RabbitMQ等。熟悉微服务架构,有Docker、Kubernete等容器化技术经验者优先。4.其他技能:具备良好的代码规范和文档编写习惯,熟悉Git等版本控制工具。具备良好的问题分析和解决能力,能够独立完成复杂模块的设计与开发。具备良好的沟通能力和团队协作精神,能够与团队成员高效合作。有强烈的责任心和自我驱动力,能够在压力下高效工作。熟悉Linux 操作系统,具备基本的服务器运维能力,能够独立部署和调试服务加分项:1.对高并发、分布式系统有深入理解,熟悉负载均衡、缓存、消息队列等技术,有高并发项目开发经验者优先。2.有广告审核相关开发经验优先
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务