JavaScript如何实现类型判断?

判断一个数据的类型,常用的方法有以下几种:

  • typeof
  • instanceof
  • Object.prototype.toString.call(xxx)

下面来分别分析一下这三种方法各自的优缺点

typeof

typeof的本意是用来判断一个数据的数据类型,所以返回的也是一个数据类型。但是会遇到下面这些问题:

  • 无法判断 null
  • 无法判断除了 function 之外的引用类型。
// 无法判断 null。
console.log(typeof null); // 输出 'object',原因在文章末尾解释。// 无法判断除了 function 之外的引用类型。
console.log(typeof []); // 'object'
console.log(typeof {}); // 'object'

incetance of

可以看到,type of无法精确判断对象的引用类型。所以在判断一个对象的引用类型时一般使用incetance of关键字。

console.log([] instanceof Array); // true
console.log(str1 instanceof String); // false,无法判断原始类型。

但是incetance of无法准确判断原始数据类型,只能用来判断数据是否是某个类的引用。到这里就能发现,如果把incetance oftype of结合起来基本就能判断所有的数据类型了。

但是,别忘记还有一个null,对于null还需要进行特殊的处理。

typeof null;	// objectif (target === null) {return "null";
}

结合这两种方法基本已经掌握了判断数据类型的手段了,但是如果去写一下你还是会发现很麻烦,你必须枚举每一种类型利用trueorfalse判断数据类型。

这里的null必须单独判断,因为这是第一版JavaScript留下来的一个bug。

JavaScript 中不同对象在底层都表示为二进制,而 JavaScript 中会把二进制前三位都为 0 的判断为 object 类型,而 null 的二进制表示全都是 0,自然前三位也是 0,所以执行 typeof 时会返回 'object'

这个 bug 牵扯了太多的 Web 系统,一旦改了,会产生更多的 bug,令很多系统无法工作,也许这个 bug 永远都不会修复了。

Object.prototype.toString.call(xxx)

这个时候就不得不提到下面这种方法了:

Object.prototype.toString.call([])	// [object Array]

这个方法会返回统一格式的字符串:[object Xxx]。然后再取出后面的xxx即可得到准确的数据类型。对于取出后面的xxx可以使用多种方法,包括但不限于字符切片、正则表达式。

这里调用call()方法是为了让this指向数组对象自身。

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

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

相关文章

哈希表笔记(四)Redis对比Java总结

文章目录 一、基础结构对比数据结构定义Java HashMapRedis字典 主要区别与设计思路 二、关键操作API对比初始化Java HashMapRedis字典 添加元素Java HashMapRedis字典 查找元素Java HashMapRedis字典 删除元素Java HashMapRedis字典 扩容/重哈希操作Java HashMapRedis字典 三、…

docker拉取国内镜像

1. 场景 最近整了一个tencent云服务器,想要玩一下docker,结果发现拉不下来,镜像根本拉不下来。 2. 原因 1.云服务器无法访问外网; 2. 国内的很多公有镜像仓库都被封了; 3. 推荐 https://zhuanlan.zhihu.com/p/713…

Codeforces Round 1008 (Div. 2) C

C 构造 题意:a的数据范围大,b的数据范围小,要求所有的a不同,考虑让丢失的那个a最大即可。问题变成:构造一个最大的a[i] 思路:令a2是最大的,将a1,a3,a5....a2*n1,置为最大的b,将a4,a…

STM32 HAL库实现USB虚拟串口

1. 引言 在嵌入式系统开发中,USB 虚拟串口是一种非常实用的功能。它允许 STM32 微控制器通过 USB 接口与计算机进行通信,就像使用传统的串口一样。这种方式不仅简化了硬件设计,还提高了通信的灵活性和稳定性。STM32F407 系列微控制器具有强大…

JAVA EE_网络原理_UDP与TCP

人海中未遇见时,我将独自前行... ----------陳長生. 1.UDP协议 1.1.UDP协议端格式 UDP(用户数据报协议)是由 源端口,目标端口,长度,校验和,数据 5种结构组成。16位是UDP报文中字段的长度&#…

【免费】1992-2021年各省GDP数据/各省地区生产总值数据

1992-2021年各省GDP数据/各省地区生产总值数据 1、时间:1992-2021年 2、来源:国家统计局、统计年鉴 3、指标:GDP/地区生产总值 4、范围:31省 5、指标说明:国内生产总值(GDP)是一个国家或地区在一定时期…

C++11新特性_范围-based for 循环

based for 循环介绍 范围 - based for 循环(Range-based for loop)是 C11 引入的一种新的 for 循环语法,它可以更简洁地遍历容器和数组。 遍历数组:定义了一个整数数组 arr,使用范围 - based for 循环 for (int num :…

【Bootstrap V4系列】学习入门教程之 页面内容排版

Bootstrap V4 学习入门教程之 页面内容排版 按钮上的指针排版一、Global settings 全局设置二、Headings 标题2.1 Customizing headings 自定义标题2.2 Display headings 显示标题2.3 Lead 引导 三、Blockquotes 块引用3.1 Naming a source 命名源3.2 Alignment 对齐 四、Lists…

Flowable7.x学习笔记(十六)分页查询我的待办

前言 我的待办具体区分为3种情况,第一个就是办理人指定就是我,我可以直接审批;第二种就是我是候选人,我需要先拾取任务然后再办理;第三种是我是候选组,我需要切换到指定的角色去拾取任务再办理。如果任务已…

EBO的使用

EBO 其实就是个索引,绑定在相应的VAO中,用来描述绘制顺序。比如在OpenGL绘制三角形的时候,假设有四个顶点,我称他们分别为1,2,3,4号顶点,常规绘制三角形函数是按三个点为一组&#x…

界面控件DevExpress WPF v25.1预览 - AI功能增强(语义搜索)

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

零基础做自动驾驶集成测试(仿真)

图 1:使用 GPUDrive 进行极快的多代理模拟。上图:GPUDrive 中 Waymo Open Motion Dataset 场景的鸟瞰图,方框表示受控智能体,圆圈表示其目标。底部:相应的代理视图,以一个代理为中心。可以根据用户的目标轻…

EasyRTC嵌入式音视频实时通话SDK技术,打造低延迟、高安全的远程技术支持

一、背景 在当今数字化时代,远程技术支持已成为解决各类技术问题的关键手段。随着企业业务的拓展和技术的日益复杂,快速、高效地解决远程设备与系统的技术难题变得至关重要。EasyRTC作为一款高性能的实时通信解决方案,为远程技术支持提供了创…

【C语言常用字符串解析】

总结一下在 C 语言中用于字符串解析(特别是从文件中读取行并提取数据)的常用函数、 核心任务: 通常是从文件中读取一行文本(一个字符串),然后从这个字符串中提取出需要的数据(比如数字、单词等…

SpringTas定时任务使用详解

文章目录 Spring Task概述1、环境配置2.注解实现定时任务2.注解实现定时任务4. cron表达式详解: Spring Task概述 在开发中,我们经常会用到定时任务,而Spring Task 则是Spring提供的定时任务框架。 其它定时任务实现框架又jdk自带Timer和Qua…

数字智慧方案6172丨智慧医院扩建信息化整体规划方案(60页PPT)(文末有下载方式)

资料解读:智慧医院扩建信息化整体规划方案 详细资料请看本解读文章的最后内容。 在信息技术飞速发展的当下,医疗行业的信息化建设成为提升医疗服务水平、优化医院管理的关键路径。这份智慧医院扩建信息化整体规划方案,针对医院扩建过程中的信…

ts全局导入接口

为了在项目中全局导入 ITableColumn 接口,避免每次使用时手动导入,可以通过以下步骤实现: 1. 全局导入的实现方式 在 Vue 项目中,可以通过在 src 目录下创建一个 global.d.ts 文件,将 ITableColumn 接口声明为全局类型…

汽车启动原理是什么?

好的!同学们,今天我们来讨论汽车的启动原理,重点分析其中的动力来源和摩擦力作用。我会结合物理概念,用尽量直观的方式讲解。 1. 汽车为什么会动?——动力的来源 汽车发动机(内燃机或电动机)工…

【音频】Qt6实现MP3播放器

1、简介 解码MP3有很多种方法,比如:FFmpeg、GStreamer、Qt、libmpg123 库等,下面介绍使用,只使用Qt的接口方法解码、播放MP3。 开发配置: 1)操作系统:Windows11 2)Qt版本:Qt6.5.1 3)编译器:MinGW_64 2、获取音频输出设备 QMediaDevices 用于获取媒体设备,包括音…

【Linux】VSCode用法

描述 部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 1 安装环境及运行C/C 1.1 安装及配置步骤 1.2 运…