javascript如何检测数据类型_typeof和instanceof有何区别【教程】

发布时间 - 2026-01-28 00:00:00    点击率:
typeof 对 null 返回 "object"(历史 bug),对数组、普通对象、正则、日期等均返回 "object",仅对函数返回 "function";instanceof 依赖原型链,跨 iframe 失效且无法检测原始值。

typeof 适合快速判断基本类型,但对 null 和对象(包括数组、正则、日期等)一律返回 "object"instanceof 可识别引用类型的构造器来源,但依赖原型链,跨 iframe 失效。

typeof 对哪些值返回意外结果?

它在几个关键地方“不准”:

  • typeof null 返回 "object"(历史 bug,已成标准)
  • typeof []typeof {}typeof /reg/typeof new Date() 全是 "object"
  • typeof function() {} 返回 "function"(这是特例,不是标准对象)
  • typeof Symbol() 返回 "symbol"typeof BigInt(1) 返回 "bigint"(ES6+ 新增,表现正常)

instanceof 的原理和典型失效场景

它本质是检查 left.__proto__ 是否沿原型链能找到 right.prototype。因此:

  • 能正确区分 [] instanceof Arraytrue)、{} instanceof Objecttrue)、/a/ instanceof RegExptrue
  • let iframe = document.createElement('iframe'); document.body.appendChild(iframe); let arr = iframe.contentWindow.Array; [] instanceof arr 返回 false(不同全局环境,原型链断裂)
  • 无法检测原始值:123 instanceof Numberfalse(数字字面量不是实例)

更可靠的类型检测方案(推荐组合)

单靠一个操作符不够,常用补救方式:

  • 判空先用 value === null,再用 typeof value === "object" 避开 null 陷阱
  • 检测数组优先用 Array.isArray(value)(最准,ES5+ 支持)
  • 检测内置对象统一走 Object.prototype.toString.call(value)
    Object.prototype.toString.call([])   // "[object Array]"
    Object.prototype.toStrin

    g.call(/a/) // "[object RegExp]"
    Object.prototype.toString.call(null) // "[object Null]"
  • 自定义类可用 instanceof,但注意避免跨上下文使用

真正难的不是记住区别,而是意识到:JavaScript 没有“类型系统”的强契约,所有检测都是基于运行时结构的推测——所以别依赖单一手段,尤其在处理第三方数据或跨环境对象时。


# javascript  # es6  # java  # app  # win  # 区别  # 数据类型  # Array  # Object  # NULL  # date  # 引用类型  # number  # symbol  # function  # regexp  # 对象  # typeof  # prototype  # bug  # iframe  # 都是  # 这是  # 几个  # 意识到  # 自定义  # 已成  # 能找到  # 再用  # 它在  # 但对 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何创建自定义Facades?(详细步骤)  如何用已有域名快速搭建网站?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Laravel如何优化应用性能?(缓存和优化命令)  七夕网站制作视频,七夕大促活动怎么报名?  如何在阿里云通过域名搭建网站?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  linux写shell需要注意的问题(必看)  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何用AWS免费套餐快速搭建高效网站?  Laravel怎么为数据库表字段添加索引以优化查询  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  大学网站设计制作软件有哪些,如何将网站制作成自己app?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  JS去除重复并统计数量的实现方法  如何将凡科建站内容保存为本地文件?  非常酷的网站设计制作软件,酷培ai教育官方网站?  js实现点击每个li节点,都弹出其文本值及修改  开心动漫网站制作软件下载,十分开心动画为何停播?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  如何在香港免费服务器上快速搭建网站?  如何在服务器上三步完成建站并提升流量?  如何挑选最适合建站的高性能VPS主机?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何快速生成凡客建站的专业级图册?  JS弹性运动实现方法分析  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速搭建虚拟主机网站?新手必看指南  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Mybatis 中的insertOrUpdate操作  如何用PHP快速搭建高效网站?分步指南  如何打造高效商业网站?建站目的决定转化率  jQuery中的100个技巧汇总  Bootstrap CSS布局之列表  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何快速生成ASP一键建站模板并优化安全性?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  JavaScript数据类型有哪些_如何准确判断一个变量的类型  大连网站制作公司哪家好一点,大连买房网站哪个好?  MySQL查询结果复制到新表的方法(更新、插入)  轻松掌握MySQL函数中的last_insert_id()  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】