前端面试-JavaScript 数据类型检测全解

目录

一、基础检测方法

二、方法深度解析

1. typeof 运算符

2. instanceof 运算符

3. 终极检测方案

三、特殊场景检测方案

四、手写实现原理

1. 通用类型检测函数

2. 改进版数组检测(兼容旧浏览器)

五、常见面试陷阱

六、最佳实践指南

七、扩展知识

总结


一、基础检测方法
方法能力范围经典案例注意事项
typeof检测基本数据类型(除 nulltypeof 'str' → 'string'typeof null → 'object'(历史遗留问题)
instanceof检测对象原型链[] instanceof Array → true跨窗口对象检测失效(如iframe)
Object.prototype.toString.call()精确检测所有类型toString.call([]) → '[object Array]'需配合 call 改变 this 指向

二、方法深度解析
1. typeof 运算符
  • 返回值类型:返回类型字符串

    typeof 42;          // "number"
    typeof 'text';      // "string"
    typeof true;        // "boolean"
    typeof undefined;   // "undefined"
    typeof Symbol();    // "symbol"
    typeof 10n;         // "bigint" (ES2020+)
    typeof function(){};// "function"
    typeof {};          // "object"
    typeof [];          // "object" (缺陷)
    typeof null;        // "object" (著名陷阱)

2. instanceof 运算符
  • 原型链检测机制

    function Car() {}
    const myCar = new Car();
    myCar instanceof Car;     // true
    myCar instanceof Object;  // true(原型链追溯)

  • 跨窗口问题

    // 不同iframe中的Array构造函数不共享原型链
    iframe.contentWindow.Array !== window.Array;
    iframeArray instanceof Array; // false

3. 终极检测方案

const typeCheck = obj => {return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
};typeCheck([]);        // 'array'
typeCheck(new Date);  // 'date'
typeCheck(null);      // 'null'
typeCheck(/regex/);   // 'regexp'
typeCheck(Symbol());  // 'symbol'

三、特殊场景检测方案
检测需求实现方案示例
数组检测Array.isArray() (ES5+)Array.isArray([1,2]) → true
NaN检测Number.isNaN() (ES6+)Number.isNaN(NaN) → true
纯对象检测组合检测obj.constructor === Object && Object.getPrototypeOf(obj) === Object.prototype
Promise检测obj instanceof Promisep instanceof Promise
Buffer检测Buffer.isBuffer() (Node.js)Buffer.isBuffer(buffer)

四、手写实现原理
1. 通用类型检测函数

function getType(obj) {// 处理 null 的特殊情况if (obj === null) return 'null';// 处理基础类型(除 symbol)const type = typeof obj;if (type !== 'object') return type;// 处理引用类型const typeStr = Object.prototype.toString.call(obj);return typeStr.slice(8, -1).toLowerCase();
}
2. 改进版数组检测(兼容旧浏览器)

const isArray = (function() {if (typeof Array.isArray === 'function') {return Array.isArray;}return function(obj) {return Object.prototype.toString.call(obj) === '[object Array]';};
})();

五、常见面试陷阱
  1. typeof 的边界情况

    typeof NaN;           // "number"(需用 Number.isNaN 判断)
    typeof document.all;  // "undefined" (历史遗留特性)

  2. 包装对象检测

    const str = new String('test');
    typeof str;          // "object"
    str instanceof String; // true

  3. 修改对象 [[Class]] 属性

    const obj = {};
    Object.prototype.toString.call(obj); // [object Object]
    obj[Symbol.toStringTag] = 'Custom';
    Object.prototype.toString.call(obj); // [object Custom]


六、最佳实践指南
  1. 基础类型检测:优先使用 typeof

  2. 数组检测:统一使用 Array.isArray()

  3. 精确类型判断:使用 Object.prototype.toString.call()

  4. 构造函数检测:慎用 instanceof(注意原型链污染风险)

  5. 特殊值检测

    • null → obj === null

    • undefined → obj === void 0

    • NaN → Number.isNaN()


七、扩展知识
  1. ES6 新增类型检测

    const set = new Set();
    Object.prototype.toString.call(set); // [object Set]const map = new Map();
    Object.prototype.toString.call(map); // [object Map]

  2. BigInt 检测

    typeof 10n; // "bigint"

  3. 异步函数检测

    async function fn() {}
    Object.prototype.toString.call(fn); // [object AsyncFunction]


总结

掌握数据类型检测是JavaScript开发的基本功,针对不同场景选择合适的检测方案:

  • 快速判断基本类型 → typeof

  • 原型链关系验证 → instanceof

  • 精确类型识别 → Object.prototype.toString.call()

  • 特定类型优化 → 专用方法(如 Array.isArray)

理解这些方法的实现原理和边界条件,能够帮助开发者写出更健壮的代码,在面试中也能从容应对相关问题的深度追问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22335.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【智能客服】ChatGPT大模型话术优化落地方案

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 一、项目背景 1.1 行业背景 1.2 业务现…

【JavaWeb12】数据交换与异步请求:JSON与Ajax的绝妙搭配是否塑造了Web的交互革命?

文章目录 🌍一. 数据交换--JSON❄️1. JSON介绍❄️2. JSON 快速入门❄️3. JSON 对象和字符串对象转换❄️4. JSON 在 java 中使用❄️5. 代码演示 🌍二. 异步请求--Ajax❄️1. 基本介绍❄️2. JavaScript 原生 Ajax 请求❄️3. JQuery 的 Ajax 请求 &a…

[Android]APP自启动

APP添加自启动权限&#xff0c;重启设备后自动打开APP。 1.AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.an…

Moonshot AI 新突破:MoBA 为大语言模型长文本处理提效论文速读

前言 在自然语言处理领域&#xff0c;随着大语言模型&#xff08;LLMs&#xff09;不断拓展其阅读、理解和生成文本的能力&#xff0c;如何高效处理长文本成为一项关键挑战。近日&#xff0c;Moonshot AI Research 联合清华大学、浙江大学的研究人员提出了一种创新方法 —— 混…

cs224w课程学习笔记-第2课

cs224w课程学习笔记-第2课 传统图学习 前言一、节点任务1、任务背景2、特征节点度3、特征节点中心性3.1 特征向量中心性&#xff08;Eigenvector Centrality&#xff09;3.2 中介中心性&#xff08;Betweenness Centrality&#xff09;3.3 接近中心性&#xff08;Closeness Cen…

Centos虚拟机扩展磁盘空间

Centos虚拟机扩展磁盘空间 扩展前后效果1 虚拟机vmware关机后&#xff0c;编辑2 扩展2.1 查看2.2 新建分区2.3 格式化新建分区ext42.3.1 格式化2.3.2 创建2.3.3 修改2.3.4 查看 2.4 扩容2.4.1 扩容2.4.1 查看 扩展前后效果 df -h1 虚拟机vmware关机后&#xff0c;编辑 2 扩展 …

1.13作业

1 if(!preg_match("/[0-9]|\~|\|\|\#|\\$|\%|\^|\&|\*|\&#xff08;|\&#xff09;|\-|\|\|\{|\[|\]|\}|\:|\|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){eval($c); 构造数组rce ?ceval(array_pop(next(get_defined_vars()))); post传参:asystem("c…

如何在 SpringBoot 项目使用 Redis 的 Pipeline 功能

本文是博主在批量存储聊天中用户状态和登陆信息到 Redis 缓存中时&#xff0c;使用到了 Pipeline 功能&#xff0c;并对此做出了整理。 一、Redis Pipeline 是什么 Redis 的 Pipeline 功能可以显著提升 Redis 操作的性能&#xff0c;性能提升的原因在于可以批量执行命令。当我…

力扣LeetCode: 2209 用地毯覆盖后的最少白色砖块

题目&#xff1a; 给你一个下标从 0 开始的 二进制 字符串 floor &#xff0c;它表示地板上砖块的颜色。 floor[i] 0 表示地板上第 i 块砖块的颜色是 黑色 。floor[i] 1 表示地板上第 i 块砖块的颜色是 白色 。 同时给你 numCarpets 和 carpetLen 。你有 numCarpets 条 黑…

RabbitMQ 消息队列

1. 消息队列是什么&#xff1f; 当用户注册成功后&#xff0c;就发送邮件。当邮件发送成功了&#xff0c;接口才会提示注册成功信息。但由于发送邮件&#xff0c;依赖于其他厂商的服务&#xff0c;有可能他们的接口会非常耗时。那么用户就一直要等着邮件发送成功了&#xff0c;…

【SQL实验】触发器

下载素材文件”tsgl”、“成绩管理”,将tsgl.bak和成绩管理.bak数据库还原到库中【导入操作在之前的文章中详细讲过】 触发器 1、为图书表设置更新触发器&#xff0c;根据总编号来更新书名、作者、出版社、分类号和单价(根据总编号找到相应记录&#xff0c;然后更新书名、作者…

Win10系统Docker+DeepSeek+ragflow搭建本地知识库

文章目录 1、安装ollama1.1 下载1.2 安装1.3 cmd命令行测试安装成功1.4 拉取模型2、安装ragflow2.1 下载项目2.2 通过docker拉取镜像安装2.3 查看docker日志是否安装成功3、模型配置3.1 第一次登录需要注册3.2 模型添加4、知识库配置4.1 创建知识库4.2 上传文档4.3 解析5、聊天…

redis的应用,缓存,分布式锁

1.应用 1.1可以用作缓存 作用&#xff1a;提交数据的查询效率&#xff0c;减少对数据库的访问频率 什么数据适合放入缓存 1.查询频率高&#xff0c;修改频率低 2.对安全系数比较低 如何实现 Service public class DeptServer {Autowiredprivate DeptMapper deptMapper;Auto…

springboot整合 xxl-job

文章目录 一、xxl-job是什么二、使用步骤 1. 下载并运行管理端代码2. 访问管理页面&#xff0c;确认是否启动成功3. 配置执行器【在自己的springboot项目中配置】4. 在页面上创建执行器和任务&#xff0c;与项目中绑定 总结参考 一、xxl-job是什么 XXL-JOB 是一个分布式任务调…

Jenkins 环境搭建---基于 Docker

前期准备 提前安装jdk、maven、nodeJs&#xff08;如果需要的话&#xff09; 创建 jenkins 环境目录&#xff0c;用来当做挂载卷 /data/jenkins/ 一&#xff1a;拉取 Jenkins 镜像 docker pull jenkins/jenkins:lts 二&#xff1a;设置 Jenkins挂载目录 mkdir -p ~/jen…

小米路由器 AX3000T 降级后无法正常使用,解决办法

问题描述 买了个 AX3000T 路由器&#xff0c;想安装 OpenWRT 或者 安装 Clash 使用&#xff0c;看教程说是需要降级到 v1.0.47 版本。 结果刷机之后路由器无法打开了&#xff0c;一直黄灯亮&#xff0c;中间灭一下&#xff0c;又是黄灯长亮&#xff0c;没有 WIFI 没有连接。以…

金融学-金融机构

前言 金融机构在金融体系运行体系运营中起着不可获缺的关键作用.如规则的制定与监管-中央银行,体系的运营证券公司,体系的供贷的参与者金融中介.本章将用一种说明我们的金融体系是怎样改进经济效率的经济分析,来讲述相关金融机构 金融结构的经济学分析 世界各国的金融体系在…

公网远程家里局域网电脑过程详细记录,包含设置路由器。

由于从校内迁居小区,校内需要远程控制访问小区内个人电脑,于是早些时间刚好自己是电信宽带,可以申请公网ipv4不需要花钱,所以就打电话直接申请即可,申请成功后访问光猫设备管理界面192.168.1.1,输入用户名密码登录超管(密码是网上查下就有了)设置了光猫为桥接模式,然后…

002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡

前文地址&#xff1a; 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控 文章目录 8.Feign远程调用、loadbalancer负载均衡整合1.OpenFeign整合1.引入依赖2.启动类添加EnableFeignClients注解3.yml配置4.日志配置5.远程调用测试6.服务…

基于javaweb的SpringBoot校园二手商品系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…