当前位置: 首页 > 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 属性来避…...

外卖系统海外版:代码与美食的完美交融

在数字化时代&#xff0c;外卖系统海外版正引领着全球美食点餐的新潮流。不仅为用户提供了便捷的用餐服务&#xff0c;更通过技术创新为美食与代码之间搭建了一座桥梁。本文将探讨其中的一些技术应用&#xff0c;并呈现与美食完美交融的全新体验。 多语言支持代码示例 def m…...

Java代码解析:初学者的编程入门指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 Java作为一门强大而广泛应用的编程语言&#x…...

数据结构--图

树具有灵活性&#xff0c;并且存在许多不同的树的应用&#xff0c;但是就树本身而言有一定的局限性&#xff0c;树只能表示层次关系&#xff0c;比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中&#xff0c;数据元素之间的关系是任意的。 一、图…...

AXure的情景交互

目录 导语&#xff1a; 1.erp多样性登录界面 2.主页跳转 3.省级联动​编辑 4. 下拉加载 导语&#xff1a; Axure是一种流行的原型设计工具&#xff0c;可以用来创建网站和应用程序的交互原型。通过Axure&#xff0c;设计师可以创建情景交互&#xff0c;以展示用户与系统的交…...

数据库操作习题12.12

考虑如下的人员数据&#xff0c;其中加下划线的是主码&#xff0c;数据库模式由四个关系组成: employee (empname, street, city) works (empname, compname, salary) company(id, compname, city) managers (empname, mgrname) 其中 关系 employee 给出人员的基本信息,包括人员…...

Redis之INCR命令,通常用于统计网站访问量,文章访问量,分布式锁

前言 Redis的INCR命令用于将键的值增加1。如果键不存在&#xff0c;则会先将键的值设置为0&#xff0c;然后再执行INCR操作。INCR命令的作用是对计数器进行自增操作&#xff0c;可以用于实现多种场景&#xff0c;比如统计网站访问量、文章访问量、分布式锁等。 一、Redis键之…...

window运行celery报错

报错信息 Traceback (most recent call last): File "c:\program files\python36\lib\site-packages\billiard\pool.py", line 359, in workloop result (True, prepare_result(fun(*args, **kwargs))) File "c:\program files\python36\lib\site-packages\ce…...

玩转Docker(五):网络

文章目录 〇、关于linux系统网络一、none网络二、host网络三、bridge网络一个问题&#xff1a;为什么在主机上仍可以通过localhost:port访问到容器中的服务&#xff1f; 四、user-defined网络 Docker安装时会自动在host上创建三个网络&#xff0c;我们可用docker network ls命令…...

选择合适教育管理软件:必须考虑的10个关键问题

随着教育行业的迅速数字化&#xff0c;学校要能够提供最新的管理和教育方法。大家逐渐意识到技术让运营变得更容易、更有效率。 不过首先我们需要找到一个能满足需求的应用程序。面对众多的选择&#xff0c;你该如何选择一个合适的平台呢&#xff1f;当然&#xff0c;没有人想…...

前端不同架构的分层设计

1. 架构设计分层: (1). 系统架构: ①. 应用场景:a. 应用在整个系统内,如与后台服务如何通信,与第三方系统如何集成.②. 前提条件:a. 了解前端系统与其它系统间的关系,包括业务关系和协作机制.b. 了解后端系统,需要规定与后台数据传递的机制,包括:(1). api设计规范(2). 访问授…...