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

探究 JavaScript 类型检查的利器:typeof 和 instanceof

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 1. 引言
    • 介绍 JavaScript 中的类型检查
  • 2. typeof 操作符
    • 定义和用法
    • 讨论typeof 的局限性
  • 3. instanceof 操作符
    • 定义和用法
    • 示例:使用 instanceof 检查对象的类型
    • 比较 instanceof 和typeof 的区别

1. 引言

介绍 JavaScript 中的类型检查

在 JavaScript 中,类型检查是一种用于确定变量或对象的数据类型的技术。它可以帮助开发者确保代码的正确性和一致性,并避免潜在的错误。

在 JavaScript 中,有两种常见的类型检查方法:typeof操作符和instanceof操作符。

  1. typeof操作符用于检查一个变量的数据类型。它返回一个字符串,表示该变量的类型。例如:
let num = 5;
console.log(typeof num); 

在这个例子中,typeof num将返回"number",因为num是一个数字类型的变量。

  1. instanceof操作符用于检查一个对象是否是某个特定类的实例。它需要一个对象和一个类作为参数,并返回一个布尔值,表示该对象是否为该类的实例。例如:
let obj = new Date();
console.log(obj instanceof Date); 

在这个例子中,obj instanceof Date将返回true,因为obj是一个Date类的实例。

需要注意的是,类型检查并不能完全保证代码的正确性,因为 JavaScript 是一种动态类型的语言,变量的类型可以在运行时改变。因此,类型检查应该与其他编程技术(如错误处理、单元测试等)结合使用,以确保代码的可靠性和稳定性。

2. typeof 操作符

定义和用法

typeof操作符是 JavaScript 中的一个一元操作符,用于获取一个变量或表达式的数据类型。

typeof操作符的语法如下:

typeof expression

其中,expression是要检查的数据。

typeof操作符会返回一个字符串,表示被检查数据的类型。以下是一些常见的返回值:

  • "number":如果expression是一个数字。
  • "string":如果expression是一个字符串。
  • "boolean":如果expression是一个布尔值。
  • "object":如果expression是一个对象(包括数组、函数等)。
  • "function":如果expression是一个函数。
  • "undefined":如果expression未定义。
  • "symbol"(ECMAScript 2015 及更高版本):如果expression是一个符号。

示例:

let num = 5;
console.log(typeof num); let str = "Hello, World!";
console.log(typeof str); let bool = true;
console.log(typeof bool); let obj = { name: "John" };
console.log(typeof obj); let func = function() {};
console.log(typeof func); let sym = Symbol("mySymbol");
console.log(typeof sym); 

在这些示例中,typeof操作符返回了被检查数据的类型。

需要注意的是,typeof操作符对于基本类型(如数字、字符串、布尔值等)可以准确地返回其类型,但对于对象类型(如数组、函数等),它只能返回"object"。如果需要更准确地检查对象的类型,可以使用instanceof操作符或其他方法。

讨论typeof 的局限性

typeof操作符是 JavaScript 中的一种简单类型检查工具,它可以返回一个字符串,表示变量的数据类型。虽然typeof操作符非常方便,但它也有一些局限性。

首先,typeof操作符只能确定基本数据类型,对于复杂的数据类型(如对象、数组、函数等),它只能返回"object"。这意味着,如果你想确定一个变量是否为特定的对象类型(如ArrayDate),你需要使用其他方法,如instanceof操作符或对象的toString方法。

其次,typeof操作符不能正确处理所有的类型转换。例如,对于null值,typeof操作符会返回"object",而不是"null"。对于undefined值,typeof操作符也会返回"undefined",而不是"object"或其他类型。

最后,typeof操作符不能检测变量的具体值,只能检测变量的数据类型。如果你想检查变量的值是否符合某个条件,你需要使用其他方法,如if语句或switch语句。

尽管typeof操作符有这些局限性,但它仍然是一种非常有用的类型检查工具,特别是在处理基本数据类型时。在使用typeof操作符时,你应该了解它的局限性,并根据需要使用其他类型检查方法来确保代码的正确性和可读性。

3. instanceof 操作符

定义和用法

instanceof操作符是 JavaScript 中的一个二元运算符,用于检查一个对象是否是某个特定类的实例。

instanceof操作符的语法如下:

obj instanceof constructor

其中,obj是要检查的对象,constructor是一个函数或构造函数对象。

instanceof操作符会返回一个布尔值,表示obj是否为constructor的实例。如果objconstructor的实例,则返回true;否则返回false

示例:

let obj = new Date();
console.log(obj instanceof Date); let arr = [5, 10, 15];
console.log(arr instanceof Array); 

在这些示例中,instanceof操作符检查了对象obj是否为Date类的实例,以及数组arr是否为Array类的实例。

需要注意的是,instanceof操作符基于对象的原型链进行检查,因此它不仅可以检查对象是否直接由某个类创建,还可以检查对象是否继承自该类。

instanceof操作符的一个常见用途是用于判断对象的类型,以便进行类型检查和类型转换。但需要注意的是,它不能检查基本类型(如数字、字符串等),因为基本类型不是对象,没有原型链。

示例:使用 instanceof 检查对象的类型

以下是一些示例,演示如何使用instanceof操作符来检查对象的类型:

// 创建一个 Date 对象
let obj = new Date();// obj 是 Date 类的实例,所以 instanceof 操作符返回 true
console.log(obj instanceof Date); // 创建一个数组对象
let arr = [5, 10, 15];// arr 是 Array 类的实例,所以 instanceof 操作符返回 true
console.log(arr instanceof Array); // 创建一个自定义类的实例
class CustomClass {constructor() {this.name = "CustomClass";}
}let customObj = new CustomClass();// customObj 是 CustomClass 类的实例,所以 instanceof 操作符返回 true
console.log(customObj instanceof CustomClass); // 创建一个对象,该对象不是任何类的实例
let obj2 = { };// obj2 不是任何类的实例,所以 instanceof 操作符返回 false
console.log(obj2 instanceof Date); 
console.log(obj2 instanceof Array); 
console.log(obj2 instanceof CustomClass); 

在这些示例中,使用instanceof操作符来检查对象是否是特定类的实例。如果对象是该类的实例,则instanceof操作符返回true;否则返回false

请注意,instanceof操作符基于对象的原型链进行类型检查,因此它可以检查对象是否继承自某个类。这在判断对象类型和进行类型转换时非常有用。

比较 instanceof 和typeof 的区别

instanceoftypeof是 JavaScript 中用于检查对象类型的操作符,但它们之间有一些区别。

  1. typeof操作符可以用于检查任何类型的变量,包括基本类型和对象类型。它返回一个字符串,表示变量的数据类型。对于基本类型,它返回相应的基本类型名称(如"number"、“string”、“boolean"等);对于对象类型,它返回"object”。

    示例:

    console.log(typeof 5); 
    console.log(typeof "Hello, World!"); 
    console.log(typeof true); 
    console.log(typeof null); 
    console.log(typeof {}); 
    console.log(typeof function() {});
    
  2. instanceof操作符只能用于检查对象类型,它返回一个布尔值,表示一个对象是否为特定类的实例。它需要一个构造函数或函数对象作为参数,并将待检查的对象作为操作数。

    示例:

    class CustomClass {constructor() {this.name = "CustomClass";}
    }let obj = new CustomClass();
    console.log(obj instanceof CustomClass); let arr = [5, 10, 15];
    console.log(arr instanceof Array); 
    

总结:

  • typeof操作符可以检查任何类型的变量,并返回一个字符串表示变量的类型。
  • instanceof操作符只能用于检查对象类型,并返回一个布尔值,表示对象是否为特定类的实例。
  • instanceof操作符基于对象的原型链进行检查,而typeof操作符则直接根据变量的类型进行检查。

在实际应用中,根据需要选择合适的操作符来检查对象的类型。如果只需要知道变量的基本类型,可以使用typeof;如果需要确定对象是否为特定类的实例,可以使用instanceof

相关文章:

探究 JavaScript 类型检查的利器:typeof 和 instanceof

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...

VSCode报错插件Error lens

1.点击左侧扩展图标→搜索“error lens”→点击“安装” 2.安装成功页面如下: 3.代码测试一下:书写代码的过程中会出现红色提醒或红色报错 4.另外推荐小伙伴们安装中文插件,学习过程中会比较实用方便,需要安装中文插件的小伙伴请点…...

go-zero开发入门之gateway深入研究1

创建一个 gateway 示例: // main.go package mainimport ("flag""fmt""gateway/middleware""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/gateway" )var configFile flag.String(&…...

【每日一题】反转二叉树的奇数层

文章目录 Tag题目来源题目解读解题思路方法一:广度优先搜索方法二:深度优先搜索 写在最后 Tag 【深度优先搜索】【广度优先搜索】【二叉树】【2023-12-15】 题目来源 2415. 反转二叉树的奇数层 题目解读 反转二叉树奇数层的节点。 解题思路 对于二叉…...

vue 项目配置反向代理导致项目白屏

问题:vue 项目配置反向代理导致项目白屏 一、现象描述 添加反向代理代码后,前端运行白屏 // 设置baseURL,8888是后端端口号,前端请求默认发送到baseURL的地址 var axios require(axios) axios.defaults.baseURL http://local…...

全国县级行政区点位数据,Shp+excel格式

基本信息. 数据名称: 县级行政区点位 数据格式: Shpexcel 数据时间: 2021年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源:网络公开数据 数据字段: 序号字段名称字段说明1xzqhdm_1省代码2xzqhmc_1省名称3xzqhdm_2市代码4xzqhmc_2市代…...

文件包含的提升刷题

上一篇文章:一篇文章带你入门文件包含-CSDN博客 已经开始入门了文件包含,那现在开始拔高提升刷题! 1. 拿到题目后啥也没有,所以也不知道要读取啥文件,那就查看源代码。 直接看if的条件就可以知道一定要设置cookie&a…...

入门级银行测试岗位招聘,只需具备这些基本条件!

2023年应该说是超乎意外的寒冷,几乎算是百业凋零。充斥在各个地方各个行业的,更多的是裁员的消息,很少有以往的风风火火的招聘了。无论是金九银十还是在以往的淡季。 谁也不知道这样一个特殊的寒冬还有多久才能过去。但是无论面对什么样的局…...

组里新来了个00后,真卷不过....

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…...

python 命令添加参数

官网 argparse模块可以很容易地编写用户友好的命令行界面。程序定义它需要什么参数,argparse将找出如何从sys.argv中解析这些参数。argparse模块还会自动生成帮助和用法消息。当用户为程序提供无效参数时,该模块也会发出错误。 核心功能 argparse模块对…...

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储,为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器,完成lo:0网卡配置,以及内核参数设置,还有设置路由表 步骤一:先完成nfs共享存储挂载 步骤二:完成lo:0网…...

jmx_exporter安装

下载 wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar 创建jmx_exporter.yml文件 文件内容为: rules: - pattern: ".*" 配置tomcatpinter/apache-tomcat-8.5.38/bin/ca…...

怎么给自己的微信公众号留言?

为什么公众号没有留言功能?根据要求,自2018年2月12日起,新申请的微信公众号默认无留言功能。有些人听过一个说法:公众号粉丝累计到一定程度或者原创文章数量累计到一定程度就可以开通留言功能。其实这个方法是2018年之前才可以&am…...

Unity中 URP 下的棋盘格Shader

文章目录 前言一、制作思路法1&#xff1a;使用纹理采样后&#xff0c;修改重铺效果法2&#xff1a;计算实现 二、粗略计算实现棋盘格效果1、使 uv.x < 0.5 区域 0 。反之&#xff0c; 0.52、使 uv.y < 0.5 区域 0 。反之&#xff0c; 0.53、使两个颜色相加4、取小数…...

杰发科技AC7840——SPM电源管理之低功耗模式

0、SPM简介 很早以前就听过低功耗模式&#xff0c;一直没有怎么深入了解&#xff0c;最近遇到几个项目都是跟低功耗有关。正好AutoChips的芯片都有电源管理的功能&#xff0c;在此借用AC7840的SPM对低功耗进行测试。 1、AC7840的5种功耗模式 2、AC7840的模式转换 3、唤醒 在…...

PCL 点云匹配 之NICP(Normal ICP)

一、概述 上面一篇中我们已经得出了一个结论&#xff0c;就是ICP虽然简单&#xff0c;但是也有明显的缺点 1、计算速度慢&#xff0c;收敛慢&#xff0c;迭代次数多 2、对内存的开销比较大 3、很容易陷入局部最优的困局 因此我们在经典ICP的基础上添加一两个约束&#xff1a; 第…...

华脉智联融合通信一张图

随着通信技术、信息技术以及互联网的发展&#xff0c;融合通信技术也日益发展成熟。融合通信系统作为常见的通信指挥调度系统&#xff0c;其发挥的功能也越来越强大&#xff0c;在不同行业中的应用也越来越丰富。 华脉智联深耕融合通信行业多年&#xff0c;自主研发的融合通信…...

Flink系列之:窗口Top-N

Flink系列之&#xff1a;窗口Top-N 一、窗口Top-N二、示例&#xff1a;在窗口聚合后进行窗口 Top-N三、在窗口表值函数后进行窗口 Top-N四、限制 一、窗口Top-N 适用于流、批一体窗口 Top-N 是特殊的 Top-N&#xff0c;它返回每个分区键的每个窗口的N个最小或最大值。与普通To…...

【k8s】--insecure-registry详解 ( 访问仓库、https、http)

文章目录 一、--insecure-registry是什么二、如何使用--insecure-registry三、--insecure-registry的安全风险四、--insecure-registry的替代方案五、总结参考 一、–insecure-registry是什么 --insecure-registry是docker中用来设置与docker registry通信的安全限制的一个参数…...

ElementUI,修改el-cascader的默认样式

Element UI 中的下拉弹窗是通过在整个body标签末尾动态添加div实现的&#xff0c;所以修改样式时&#xff0c;必须要定义全局样式才能实现样式覆盖&#xff0c;那怎样才能避免全局的样式污染呢&#xff1f; 解决办法&#xff1a;通过给组件添加自定义的 popper-class 属性来避…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...