【Javascript】数据类型检测

文章目录

  • 一、typeof
    • 1、描述
    • 2、示例
  • 二、instanceof
    • 1、语法
    • 2、示例
  • 三、Object.prototype.toString.call()
    • 1、描述
    • 2、语法
    • 3、示例
    • 4、通用判断方法

在JavaScript中,你可以用不同的方式检测数据类型。这是因为JavaScript是一种弱类型或动态语言,变量没有预先定义的类型。以下是一些常用的数据类型检测方法:

一、typeof

1、描述

typeof 运算符返回一个字符串,表示操作数的类型
typeof 可能的返回值:

类型结果
Undefined“undefined”
Null“object”
Boolean“boolean”
Number“number”
BigInt“bigint”
String“string”
Symbol“symbol”
Function“function”
其他任何对象“object”

2、示例

2.1 基本用法:

// 数值
typeof 37 === "number";
typeof 3.14 === "number";
typeof Math.LN2 === "number";
typeof Infinity === "number";
typeof NaN === "number"; // 尽管它是 "Not-A-Number" (非数值) 的缩写
typeof Number(1) === "number"; // Number 会尝试把参数解析成数值
typeof Number("shoe") === "number"; // 包括不能将类型强制转换为数字的值typeof 42n === "bigint";// 字符串
typeof "bla" === "string";
typeof `template literal` === "string";
typeof "1" === "string"; // 注意内容为数字的字符串仍是字符串
typeof typeof 1 === "string"; // typeof 总是返回一个字符串
typeof String(1) === "string"; // String 将任意值转换为字符串,比 toString 更安全// 布尔值
typeof true === "boolean";
typeof false === "boolean";
typeof Boolean(1) === "boolean"; // Boolean() 会基于参数是真值还是虚值进行转换
typeof !!1 === "boolean"; // 两次调用 !(逻辑非)运算符相当于 Boolean()// Symbols
typeof Symbol() === "symbol";
typeof Symbol("foo") === "symbol";
typeof Symbol.iterator === "symbol";// Undefined
typeof undefined === "undefined";
typeof declaredButUndefinedVariable === "undefined";
typeof undeclaredVariable === "undefined";// 对象
typeof { a: 1 } === "object";// 使用 Array.isArray 或者 Object.prototype.toString.call
// 区分数组和普通对象
typeof [1, 2, 4] === "object";typeof new Date() === "object";
typeof /regex/ === "object";// 下面的例子令人迷惑,非常危险,没有用处。避免使用它们。
typeof new Boolean(true) === "object";
typeof new Number(1) === "object";
typeof new String("abc") === "object";// 函数
typeof function () {} === "function";
typeof class C {} === "function";
typeof Math.sin === "function";

typeof null:

// JavaScript 诞生以来便如此
typeof null === "object";

在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null 也因此返回 “object”

二、instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
简单地说,它可以用来判断一个对象是否是某个特定构造函数创建的实例,或者说一个对象是否继承自某个构造函数

1、语法

object instanceof constructor
  • object : 某个实例对象
  • constructor : 某个构造函数

2、示例

// 定义构造函数
function C() {}
function D() {}var o = new C();
o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因为 D.prototype 不在 o 的原型链上
o instanceof Object; // true,因为 Object.prototype.isPrototypeOf(o) 返回 true
C.prototype instanceof Object; // true,同上C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上。D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true 因为 C.prototype 现在在 o3 的原型链上

三、Object.prototype.toString.call()

1、描述

通常我们用typeof运算符或instanceof运算符来检测一个变量的类型,但这两种方式有时候不能给出我们想要的详细信息

Object.prototype.toString.call() 提供了一种更可靠的类型检测方法。

说明:

  • 适用于判断JavaScript的内置类型(如String、Number、Array、Function、Object、Date等),因为当它被调用时,会返回一个标准化的字符串,该字符串明确地表明了目标对象的内置类型
  • 对于用户自定义的对象类型,Object.prototype.toString.call 返回的字符串总是[object Object],如果需要判断自定义对象类型,则使用 instanceof

2、语法

Object.prototype.toString.call(value)
  • value 是任何类型的对象,函数将返回该对象的类类型信息
  • 返回一个表示对象类型的字符串。这个字符串的格式总是[object Type],其中Type是对象的类型

3、示例

Object.prototype.toString.call(2);  // "[object Number]"
Object.prototype.toString.call(true);  // "[object Boolean]"
Object.prototype.toString.call('hello');  // "[object String]"
Object.prototype.toString.call([]);  // "[object Array]"
Object.prototype.toString.call(function(){});  // "[object Function]"
Object.prototype.toString.call({});  // "[object Object]"
Object.prototype.toString.call(null);  // "[object Null]"
Object.prototype.toString.call(undefined);  // "[object Undefined]"
Object.prototype.toString.call(new Date());  // "[object Date]"
Object.prototype.toString.call(Math);  // "[object Math]"
Object.prototype.toString.call(new Error());  // "[object Error]"

4、通用判断方法

附上 vue 源码的封装方法:

function  toRawType(value) {return Object.prototype.toString.call(value).slice(8, -1);
}

测试:

toRawType(null)  // Null
toRawType([])  // Array
toRawType('hello')  // String
toRawType(24)  // Number
toRawType(undefined)  // Undefined
toRawType({name: 'hello'})  // Object

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

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

相关文章

Linux 安装KVM虚拟机

什么是KVM虚拟机? KVM 是 Kernel-based Virtual Machine 的缩写,是一种用于虚拟化的开源硬件虚拟化技术。它使用 Linux 内核的虚拟化模块,将物理服务器划分为多个虚拟机。KVM 允许虚拟机直接访问物理硬件资源,从而提供出色的性能和稳定性,同…

WARNING: No swap limit support——查看docker状态时提示警告

环境:Ubuntu 20.04 1、警告详情 执行命令 service docker status如下图 2、解决办法 2.1 修改文件 执行命令 vim /etc/default/grub在GRUB_CMDLINE_LINUX中追加cgroup_enablememory swapaccount1,如下: # If you change this file…

MyBatis 面试题(四)

1. MyBatis 中 Mapper 接口的实现原理是? MyBatis 中 Mapper 接口的实现原理主要基于 Java 的动态代理和反射机制。以下是 Mapper 接口实现原理的详细解释: Mapper 接口定义:首先,开发者需要定义一个 Mapper 接口,该接口中声明了…

【六】fastapi+vue前后端分离项目

前端代码 https://gitee.com/feiminjie/helloworldfront 后端代码 https://gitee.com/feiminjie/helloworld 整体效果 首页 用例管理页 用例详情页

GPT 浅析

GPT 浅析 文章目录 GPT 浅析GPT 1无监督预训练有监督微调任务相关的输入变换 GPT2GPT3 GPT 1 在模型架构上,GPT-1基于Transformer构造,这是因为与其他卷积神经网 络或者循环神经网络相比,Transformer提供了效率更高的方法来处理文本 中的长期…

几年前删除的照片如何恢复?5步操作,快速找回iPhone照片

“去年三月份参加了社区的志愿者活动拍了好几张照片,近期学校组织我申报市级优秀学生需要我的参加志愿者的照片当材料,但是照片在一年前就删掉了。删除的时间比较久,各位有没有什么方法可以恢复苹果手机的照片?” 在使用苹果手机的…

rk3588 安卓调试

rknn装上了android系统,用type-c usb连接上电脑,设备管理器发现了rk3588,但是Android Studio没有发现设备 后来怀疑是驱动没有安装,我用的驱动下载地址: 瑞芯微Rockchip驱动安装助手(适用于RK3308 RK3399等) Mcuzone…

使用Python实现集成学习算法:Bagging与Boosting

集成学习是一种机器学习方法,它通过结合多个弱学习器来构建一个强大的模型,从而提高预测的准确性和稳定性。在本文中,我们将介绍两种常见的集成学习算法:Bagging(自举聚合)和Boosting(提升法&am…

还有同学开题报告没写吗?

引言 作为一名在软件技术领域深耕多年的专业人士,我不仅在软件开发和项目部署方面积累了丰富的实践经验,更以卓越的技术实力获得了🏅30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定,也是对我的创新精神和专业承诺…

springboot 文件上传Linux环境报错

java.io.IOException: Malformed input or input contains unmappable characters: /data/upload_file/upload/2020/04/16/测试专用_20240416114011A001.pdf程序部署到Linux环境下,文件上传报错,这是因为服务器编码问题。 使用命令查看服务器编码&#x…

【智能算法】鸭群算法(DSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年,Zhang等人受到自然界鸭群觅食行为启发,提出了鸭群算法(Duck Swarm Algorithm, DSA)。 2.算法原理 2.1算法思想 DSA基于自然界鸭群觅食过程&…

matplotlib手动调用默认配色

matplotlib 画图有个默认配色方案,在画不同图时会保持一致。如: import numpy as np import matplotlib.pyplot as plt# 图 1 数据 x np.arange(12).astype(np.float32) 1 y1 np.log(x) y2 1 / x y3 np.sin(x) # 图 2 数据 a np.random.randn(200…

十万栋BIM建筑同屏加载!AMRT3D引擎领跑,强力赋能数字孪生

AMRT3D数字孪生引擎https://www.amrt3d.com/#/ AMRT3D是让用户轻松搭建智慧城市、智慧工厂、CIM系统等类型应用的轻量化图形引擎,通过基于自主研发三维底层技术支持,可以让数字化、可视化项目轻松运行在Web等多平台。 它提供了百余种3D功能,…

GpuMall智算云在GPU云领域有哪些核心技术?

GpuMall智算云领域拥有多项核心技术,这些技术共同构成了其强大且高效的GPU算力服务平台。以下是一些GpuMall智算云领域的核心技术: GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 1. GPU算力资源池化技术 GpuMall利用…

公园高速公路景区校园IP网络广播音柱SIP音柱

公园高速公路景区校园IP网络广播音柱SIP音柱 适用于学校、车站、教堂、工厂、仓库、公园停车场及露天市场高速公路等场所播放录制语音文件或背景音乐节目,专业一体化音箱设计,高强度防水设计,符合IP54防护等认证,数字化产品&…

银河麒麟服务器系统中mysql数据库使用gdb内存回收报错问题处理

银河麒麟服务器系统中mysql数据库使用gdb内存回收报错问题处理 一 系统环境二 问题现象三 分析原因四 解决方法 问题描述:在系统中执行回收命令(gdb --batch --pid pidof mysqld --ex ‘call malloc_trim(0)’;)报错’malloc_trim’ has unkn…

C++设计模式|创建型 2.工厂模式

1.简单工厂思想 简单工厂模式不属于23种设计模式之⼀,更多的是⼀种编程习惯。它的核心思想是将产品的创建过程封装在⼀个⼯⼚类中,把创建对象的流程集中在这个⼯⼚类⾥⾯。卡码网将其结构描述为下图所示的情况: 简单⼯⼚模式包括三个主要⻆⾊…

有且仅有的10个常见的排序算法,东西不多,怎么就背不下来呢

就这么跟你说吧,面试中肯定会出排序算法的算法题,你只需要背下来代码背下来他们的时间复杂度和空间复杂度就能蒙混过关。 不管你是前端还是后端,关于排序的算法有且仅有这 10个,如果你用心了,怎么会记不住呢。看完这篇…

docker安装并跑通QQ机器人实践(2)-签名服务器bs-qsign搭建

在前文中,我们详尽阐述了QQ机器人的搭建过程及其最终实现的各项功能展示。接下来,我们将转向探讨该项目基于Docker构建服务的具体实践。本篇将以QQ机器人签名服务——qsign为起点,逐步展开论述。 1 获取和运行 xzhouqd/qsign:8.9.63 镜像 1.…

社交媒体数据恢复:YY语音

YY语音数据恢复指南 在我们的日常生活中,数据丢失是一种常见的现象。有时候,我们可能会不小心删除了重要的文件,或者因为硬件故障而导致数据丢失。在这种情况下,数据恢复软件可以帮助我们找回丢失的数据。本文将重点介绍如何使用Y…