当前位置: 首页 > news >正文

JS中typeof与instanceof的区别

typeofinstanceof 在 JavaScript 里虽然都是用来判断类型的,但它们的工作方式、适用场景和返回值有很大区别。

我帮你分成几个维度对比一下:


1. 基本语法

typeof value        // 返回一个表示类型的字符串
value instanceof Constructor // 返回 true 或 false

2. 作用范围

特性typeofinstanceof
作用对象基本类型(number, string, boolean, symbol, bigint, undefined)和引用类型(object, function)只能判断引用类型(对象、数组、函数等),不能判断原始类型
返回值一个字符串(如 "number""string""object"布尔值(true / false)

3. 适用场景

typeof

  • 主要用于基本类型的判断(除了 null)。

  • 语法简单,性能好,但对对象的区分能力差。

typeof 123;             // "number"
typeof "hello";         // "string"
typeof undefined;       // "undefined"
typeof true;            // "boolean"
typeof Symbol();        // "symbol"
typeof 10n;             // "bigint"// 对对象的判断很模糊
typeof {};              // "object"
typeof [];              // "object"
typeof null;            // "object"  <-- 历史遗留 bug
typeof function(){};    // "function" (特殊情况)

instanceof

  • 用于判断某个对象是否是某个构造函数的实例(依赖原型链)。

  • 更适合复杂对象类型判断,比如 ArrayDateRegExp 等。

[] instanceof Array;        // true
[] instanceof Object;       // true (Array 继承自 Object)
new Date() instanceof Date; // true
/abc/ instanceof RegExp;    // true// 原始类型不行
123 instanceof Number;      // false
"abc" instanceof String;    // false

4. 工作原理差异

  • typeof
    直接读取内部的 [[Type]](对原始类型)或部分特殊规则(函数)。

  • instanceof
    检查 对象的原型链 是否能找到目标构造函数的 prototype 属性:

    obj instanceof Constructor
    // 等价于:
    // Constructor.prototype 是否出现在 obj 的原型链上
    

5. 注意事项

  1. typeof null"object" —— 这是 JavaScript 设计早期的 bug。

  2. instanceof 在多 iframe / 多 window 环境下可能会失效,因为不同全局环境的构造函数不一样。

  3. 基本类型用 typeof,对象类型用 instanceof 更稳妥。

  4. 判断数组更推荐 Array.isArray(),因为跨环境也安全:

    Array.isArray([]); // true
    

总结对比表

对比点typeofinstanceof
返回值类型字符串布尔值
可判断基本类型 + 引用类型(精确度有限)引用类型(对象、数组、函数等)
判断原理内部类型标签([[Type]]检查原型链
适用场景判断原始类型判断某对象是否属于某构造函数
特殊问题null 返回 "object"跨 iframe/window 可能失效

http://www.dtcms.com/a/324881.html

相关文章:

  • 【精彩回顾·成都】成都 User Group×柴火创客空间:开源硬件驱动 AI 与云的创新实践!
  • JS 注释类型
  • ADK[3]历史对话信息保存机制与构建多轮对话机器人
  • scanpy单细胞转录组python教程(四):单样本数据分析之降维聚类及细胞注释
  • 【Canvas与戳记】黑底金Z字
  • 正确使用SQL Server中的Hint(10)— 常用Hint(2)
  • Spring WebSocket安全认证与权限控制解析
  • 研究揭示 Apple Intelligence 数据处理中可能存在隐私漏洞
  • 【redis初阶】------List 列表类型
  • 通过脚本修改MATLAB的数据字典
  • 【15】OpenCV C++实战篇——fitEllipse椭圆拟合、 Ellipse()画椭圆
  • 【人工智能99问】BERT的原理什么?(23/99)
  • Elasticsearch 保姆级入门篇
  • SpringBoot查询方式全解析
  • 在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合
  • 数字图像处理2——图像增强
  • AI(1)-神经网络(正向传播与反向传播)
  • 【RL第七篇】PPO训练策略,如何使PPO训练稳定?
  • unity中如何让原人物动画兼容新人物的动画
  • 异步问题的概念和消除问题技巧
  • Graph-R1:一种用于结构化多轮推理的智能图谱检索框架,并结合端到端强化学习
  • 【面板数据】全国及各省份技术市场成交额数据-dta+xlsx格式(2001-2023年)
  • nginx+lua+redis案例
  • 《Webpack与Vite热模块替换机制深度剖析与策略抉择》
  • 消息生态系统全景解析:技术架构、核心组件与应用场景
  • 【Python练习】085. 编写一个函数,实现简单的DNS服务器功能
  • LeeCode 46. 全排列
  • 【树\思维】P1395 会议
  • 33.搜索旋转排序数组
  • Agno智能体框架简单使用