首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

别再被坑了! JavaScript类型检测的最佳实践

编程知识
2024年08月16日 14:42

别再被坑了! JavaScript类型检测的最佳实践

在 JavaScript 中,我们经常需要判断一个变量的类型。这个需求在编程中非常常见,因为不同类型的数据会影响到我们的代码逻辑。

JavaScript 提供了几种方法来检测数据类型,每种方法都有自己的优缺点。

Object.prototype.toString.call()

这是最万能的方法。它可以准确识别所有的 JavaScript 内置类型,包括基本类型和复杂类型。不管你给它传什么数据,它都能给出一个统一格式的字符串,告诉你这个数据到底是什么类型。

它的原理是调用对象内部的 [[Class]] 属性。这个属性是只读的,不能被改写,所以非常可靠。

优点:

  • 识别范围广,基本类型和复杂类型都能识别
  • 不会受到对象自身的 toString() 方法的影响
  • 返回结果格式统一,方便解析

缺点:

  • 写起来比较啰嗦
  • 如果是自定义类型,只能得到 [object Object],不能进一步区分类型
function detectType(data) {
    return Object.prototype.toString.call(data).slice(8, -1).toLowerCase();
}

console.log(detectType(123)); // 'number'
console.log(detectType('abc')); // 'string'
console.log(detectType(true)); // 'boolean'
console.log(detectType(null)); // 'null'
console.log(detectType(undefined)); // 'undefined'
console.log(detectType([])); // 'array'
console.log(detectType({})); // 'object'
console.log(detectType(function () {})); // 'function'
console.log(detectType(new Date())); // 'date'
console.log(detectType(new RegExp())); // 'regexp'
console.log(detectType(new Error())); // 'error'

typeof

这个运算符最常用,写起来简单。它可以识别基本类型和函数,但对复杂类型的识别能力有限。

优点:

  • 使用简单
  • 可以识别基本类型和函数

缺点:

  • 无法区分数组和普通对象
  • typeof null 的结果是 'object'
  • 无法识别内置对象类型,如 DateRegExp
console.log(typeof 123); // 'number'
console.log(typeof 'abc'); // 'string'
console.log(typeof true); // 'boolean'
console.log(typeof undefined); // 'undefined'
console.log(typeof null); // 'object' (这是一个历史遗留的 bug)
console.log(typeof []); // 'object'
console.log(typeof {}); // 'object'
console.log(typeof function () {}); // 'function'

instanceof

instanceof 运算符用于测试构造函数的 prototype 属性是否出现在对象的原型链中的任何位置。

优点:

  • 可以检查对象是否属于特定的类或构造函数

缺点:

  • 只能检查对象类型,不能检查基本类型
  • 要识别多种类型,需要多次调用
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(function () {} instanceof Function); // true
console.log(new Date() instanceof Date); // true
console.log(new RegExp() instanceof RegExp); // true
console.log(new Error() instanceof Error); // true

console.log(123 instanceof Number); // false
console.log('abc' instanceof String); // false
console.log(true instanceof Boolean); // false

constructor

constructor 是对象的一个属性,指向创建该对象的构造函数。可以用它来判断对象的类型。

优点:

  • 可以识别大多数对象类型,包括自定义类型

缺点:

  • 如果对象的 constructor 属性被修改,会得到错误结果
  • nullundefined 没有 constructor 属性
console.log((123).constructor === Number); // true
console.log('abc'.constructor === String); // true
console.log(true.constructor === Boolean); // true
console.log([].constructor === Array); // true
console.log({}.constructor === Object); // true
console.log(function () {}.constructor === Function); // true
console.log(new Date().constructor === Date); // true
console.log(new RegExp().constructor === RegExp); // true
console.log(new Error().constructor === Error); // true

总结

如果需要全面准确的类型识别,Object.prototype.toString.call() 是最佳选择。
如果只需要简单区分基本类型,typeof 就足够了。
如果要检查对象是否属于特定类型,可以用 instanceof

在实际应用中,我们可以根据具体需求选择合适的方法。

结语

上次我开发了一个工具,可以批量清理无用的仓库。如果你感兴趣,可以去看看哦!😊

介绍文章https://mp.weixin.qq.com/s/t7lgc6b7xJiNhfm5vWo5-A

GitHub 仓库地址https://github.com/yaolife ng0629/del-repos

如果你觉得这个工具对你有所帮助,请不要忘记给我的 GitHub 仓库 点个 Star ⭐!你的支持是我前进的动力!

感谢阅读,我们下次再见!

From:https://www.cnblogs.com/leadingcode/p/18362986
本文地址: http://shuzixingkong.net/article/1161
0评论
提交 加载更多评论
其他文章 mysql8.0 主从架构模式【0到1架构系列】
前提条件 准备3,4,5台虚拟机 祼装mysql8.0 主从架构 常见两种模式“一主多从”和“级联复制”两种,基本都很简单,都是依赖binlog日志文件进行同步,binlog日志会记录DDL和部分DDL语句,进行同步时从库会重新执行这些语句从而实现主从同步。 步骤1: 配置主/从服务器的server
mysql8.0 主从架构模式【0到1架构系列】 mysql8.0 主从架构模式【0到1架构系列】 mysql8.0 主从架构模式【0到1架构系列】
reduce() 多种用法
reduce()方法用于将数组简化为单一值,通过遍历数组并应用提供的函数。它可以用于求和、乘积、计算对象属性的总和、数组去重和转换数组结构等。初始值的设置会影响reduce的起始索引。不提供初始值时,从索引1开始执行;提供初始值则从索引0开始。 一、 定义和用法reduce() 方法将数组缩减为单个
2024 暑假记
说明 本篇文章用于记录暑假每天的作息、安排、收获和经历。 \(2024 - 06 - 24\) 会考啦,在郑州市创新实验中学考点 \(52\) 考场 \(17\) 号。 第一场生物,考完后去操场休息了会,见到挺多认识的同学,还见到了很久没联系的小学同学,差点没认出来。 第二场地理,挺简单的,基本都是
2024 暑假记 2024 暑假记 2024 暑假记
我是如何使用 vue2+element-ui 处理负责表单,避免单文件过大的问题
引言 在工作中我经常需要处理一些复杂、动态表单,但是随着需求不断迭代,我们也许会发现曾经两三百行的.vue文件现在不知不觉到了两千行,三千行,甚至更多... 这对于一个需要长期维护的项目,无疑是增加了很多难度。 因此,为了减小文件大小,优化表单组织的结构,我在日常的开发中实践出一种基于组件的表单拆分
.NET8 Blazor 从入门到精通:(二)组件
目录Blazor 组件基础路由导航参数组件参数路由参数生命周期事件状态更改组件事件 Blazor 组件 基础 新建一个项目命名为 MyComponents ,项目模板的交互类型选 Auto ,其它保持默认选项: 客户端组件 (Auto/WebAssembly): 最终解决方案里面会有两个项目:服务器
.NET8 Blazor 从入门到精通:(二)组件 .NET8 Blazor 从入门到精通:(二)组件 .NET8 Blazor 从入门到精通:(二)组件
games101 作业4及作业5 详解光线追踪框架
games101 作业4及作业5 详解光线追踪框架 作业4 代码分析 作业四的代码整体比较简单 主要流程就是 通过鼠标事件 获取四个控制点的坐标 然后绘制贝塞尔曲线的内容就由我们来完成 理论分析 贝塞尔曲线的理论就是给定一组控制点 然后不断的在控制点之间进行插值 再在得到的新的插值点之间进行插值 具
games101 作业4及作业5 详解光线追踪框架 games101 作业4及作业5 详解光线追踪框架 games101 作业4及作业5 详解光线追踪框架
WPF 怎么把checkbox改成开关样式
先看一下效果吧: isChecked = false 的时候的效果 isChecked = true 的时候的效果 然后我们来实现一下这个效果吧 第一步:创建一个空的wpf项目; 第二步:在项目里面添加一个checkbox <Grid> <CheckBox HorizontalAl
WPF 怎么把checkbox改成开关样式 WPF 怎么把checkbox改成开关样式 WPF 怎么把checkbox改成开关样式
CRC算法原理、推导及实现
CRC, Cyclic Redundancy Check, 循环冗余校验 1. 基本原理 CRC的本质是除法,把待检验的数据当作一个很大(很长)的被除数,两边选定一个除数(有的文献叫poly),最后得到的余数就是CRC的校验值。 判定方法: 将消息和校验和分开。计算消息的校验和(在附加W个零后),并