JS中的类型判断,你真的完全理解吗

前言

在刚开始学JS的时候,经常自己做点小demo玩玩,然后自己去不断完善一些功能,有次在做一个界面的时候用到了类型判断,正当我觉得一切正常的时候,突然发现我们常用的typeof方法会将空值识别为object?!于是赶紧深入了解,才发现简简单单的类型判断居然有这么多门道。

正文

  1. typeof 操作符

Typeof这个方法可谓是我心中的白月光,在JavaScript判断类型的时候最先想到的通常都是这个玩意,我们可以使用typeof操作符来判断一个值的数据类型。typeof操作符返回一个表示操作数类型的字符串。它对于大多数基本数据类型都能够准确判断,但对于对象和null的判断则有一些特殊之处。

js 复制代码
    console.log(typeof null);
    console.log(typeof []);
    console.log(typeof function fn() {});

很显然,这种方法并不能很好地解决数组和null这两种类型的值的类型判断。但是为什么null偏偏会被判断成为对象呢?其实这就是JavaScript这门语言设计之初的一个bug。Typeof方法本质上就是将数据转变为二进制的值,然后根据前三位去判断类型。对象的前三位全都是0,但好巧不巧的是,null的二进制被设计成了全都是0,这也就是为什么null会被typeof识别成object,属于是瞒天过海了。所以,我们需要一些更高级的玩意

  1. instanceof 操作符

相对于typeof直接搜人家身份,instanceof操作符可要高级多了,instanceof用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。它通常用于判断一个对象是否是某个特定类的实例。就好比不再是简简单单查你身份,而是连你的家属都查了。这里举个简单的例子

js 复制代码
function Person() {} 
const person = new Person();
console.log(person instanceof Person); // true

相比于typeof,instanceof显然要可靠得多,判断的类型也不再是JavaScript中自带的值,不过美中不足的是,他依然会将数组判断为object,并且返回值为布尔值,也就意味着它不能直接告诉你这个值是什么类型,只能告诉你是或者不是

  1. Object.prototype.toString.call()

说到这里不免会有些生气:难道我堂堂JavaScript就没有点能精确判断类型的方法了吗?当然不会, Object.prototype.toString.call()就可以完美判断出类型。在 JavaScript 中,每个对象都有一个内部属性 Class,它用于标识对象的类别。这个属性的值是一个字符串,表示对象的具体类型。

Object.prototype.toString 方法被重写,使得当调用它时,会返回包含 Class 值的字符串。这样就可以通过判断返回的字符串来确定对象的类型。例如,对于数字类型的值 42,其 Class 值为 Number,所以 Object.prototype.toString.call(42) 返回的字符串就是 [object Number]

同样地,对于字符串、布尔值、undefined、null 等类型,它们的 Class 值分别为 "String"、"Boolean"、"Undefined" 和 "Null"。

而对于对象和数组类型,它们的 [[Class]] 值分别为 ObjectArray。因此,通过 Object.prototype.toString.call() 方法可以准确地判断出对象和数组的类型

总结

希望各位通过以上的介绍能够更加深入地了解了JavaScript中类型判断的几种常见方法,能够帮助到大家。在实际开发中,根据不同的需求选择合适的类型判断方式是非常重要的。最后祝各位0 waring(s) 0 error(s)

相关推荐
子兮曰3 小时前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
前端·后端·bun
kyriewen4 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
问心无愧05134 小时前
ctf show web 入门42
android·前端·android studio
kyriewen5 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u5 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby5 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情6735 小时前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇5 小时前
前端转后端:SQL 是什么
前端
张元清6 小时前
React Observer Hooks:7 种监听 DOM 而不写样板代码的方式
前端·javascript·面试
广州华水科技6 小时前
单北斗GNSS变形监测是什么?主要有怎样的应用与优势?
前端