(JS)数据类型大揭秘:深度解析几种最常用的方法

前言:

不论你已经学习过几种数据类型的判断方法,本文将带给大家今后最最最实用的三种方法。 并且通过一些实例,详细分析它的使用方法和范围,及其优缺点

本文讨论的数据类型

七种原始数据类型(附带两种es6新增):

  1. string
  2. number
  3. boolean
  4. undefined
  5. null
  6. symbol
  7. big number

以及五种引用类型:

  1. 对象
  2. 数组
  3. 方法
  4. 日期
  5. 正则表达式

1.typeof

typeof 是一个用于检测给定变量的数据类型的运算符。它能返回一个表示变量类型的字符串。

使用方法typeof(xxx) 、 typeof xxx :即加括号或空格均可。

使用范围: 可以准确判断 除null之外 的原始数据类型(六种),还可以判断function。

javascript 复制代码
//原理:typeof 将数据转化为2进制数,前面三位是0就是对象
//除null之外 的原始数据类型
console.log(typeof 1);   //number
console.log(typeof 'Bill'); //string
console.log(typeof 123n);  //bigint
console.log(typeof true);  //boolean
console.log(typeof null); //object 历史遗留问题

//2. typeof不能判断引用类型,但是 function 除外
console.log(typeof {}); //object
console.log(typeof []); //object
console.log(typeof function(){}); //function

优点

  1. 简单易用: typeof 是一种简单的方式来获取变量的基本数据类型,特别是在处理基本数据类型时,代码变得简洁而易读。
  2. 适用于原始数据类型
  3. 无需变量声明: typeof 可以在变量未声明的情况下使用,不会抛出错误。这在某些动态环境中可能是一个优点。

缺点:

  1. 不适用于详细类型检查: typeof 并不是一种详细的类型检查工具,特别是对于复杂数据类型(如对象、数组),它只能告诉你它们是对象,而无法区分具体的对象类型。
  2. null 的问题: typeof null 返回 "object",这是 JavaScript 设计的历史遗留问题,可能导致误解。
  3. 无法检测自定义对象类型: 对于自定义的对象类型,typeof 只能返回 "object",而不能区分不同的对象类型。
  4. 不能检测函数参数类型: 在函数参数类型检查的场景中,typeof 通常不够用,因为它不能区分不同的对象类型。

2.instanceof

instanceof 是通过原型链查找来判断数据类型的一个操作符,其结果是返回一个布尔值。

使用方法: object instanceof constructor

其中object是要检查的对象,constructor是要检查的构造函数。instanceof的工作原理是检查object的原型链上是否存在constructor.prototype,有则返回true。

使用范围: 用于判断引用类型。

javascript 复制代码
console.log(instanceOF([],Array)); //true
console.log(instanceOF([],Object)); //true

console.log(instanceOF(obj,Object)); //true
console.log(instanceOF(function(){},Function)); //true
console.log(instanceOF(time,Date)); //true

console.log(str instanceof String);//false

优点:

  1. 简单易用: instanceof 是一种比较简单的类型检测方法,适用于引用类型的判断。
  2. 原型链检测: 通过检查原型链,instanceof 可以检测对象的继承关系,而不仅仅是直接实例关系。

缺点:

  1. 无法跨 iframe 检测: 如果对象是在不同的 iframe 中创建的,instanceof 将返回 false,因为它只在同一全局对象中有效。
  2. 无法准确检测基本类型: instanceof 主要用于检测对象的实例关系,对于基本数据类型(如字符串、数字、布尔值等),它的判断可能会出现错误。

------那么如何解决这些问题呢?

实际开发中,为了更精确地进行类型检查,就会引入下面这种方法

3.object.prototype.toString

Object.prototype.toString 方法是一种用于获取对象的内部属性 [[Class]] 的通用方法。该属性表示对象的内部标识,可以用于进行更准确的类型判断。

使用方法: Object.prototype.toString 方法不是直接调用 的,而是通过以下方式调用:Object.prototype.toString.call。返回由 "[object" 和 class 和 "]" 三部分组成的字符串,而class表示对象的类型。

使用范围: 适用于一切数据类型

javascript 复制代码
console.log(Object.prototype.toString.call('hello' ));//[object String]
console.log(Object.prototype.toString.call(123)); //[object Number]
console.log(Object.prototype.toString.call(false)); // [object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call(123n)); //[object BigInt]
console.log(Object.prototype.toString.call(Symbol('hello'))); //[object Symbol]
console.log(Object.prototype.toString.call({})); //[object Object]
console.log(Object.prototype.toString.call([])); //[object Array]
console.log(Object.prototype.toString.call(function(){})); //[object Function]
let data = new Date //日期
console.log(Object.prototype.toString.call(data)); //[object Date]

优点: 通过调用 Object.prototype.toString.call,我们可以获取到更准确的类型信息,尤其是对于内置对象和用户自定义对象,对原始数据类型也同样适用。

总结

这篇文章中,我们详细介绍了 JavaScript 中的三种最常用的类型判断方法:typeof 方法、instanceof 方法、Object.prototype.toString.call 方法。

总的来说,本文介绍了这些类型判断方法的用法和优缺点,并强调了在不同情况下选择合适的方法以确保准确性和可靠性。在你的实际项目中,你更倾向于使用哪种类型判断方法呢?你遇到过哪些关于类型判断的挑战?欢迎分享你的经验和看法!

点个免费的赞鼓励支持一下吧! 个人Gitee仓库:Code Space: 记录学习code中的点点滴滴 (gitee.com)

相关推荐
wearegogog1233 小时前
基于 MATLAB 的卡尔曼滤波器实现,用于消除噪声并估算信号
前端·算法·matlab
Drawing stars3 小时前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
品克缤3 小时前
Element UI MessageBox 增加第三个按钮(DOM Hack 方案)
前端·javascript·vue.js
小二·3 小时前
Python Web 开发进阶实战:性能压测与调优 —— Locust + Prometheus + Grafana 构建高并发可观测系统
前端·python·prometheus
小沐°3 小时前
vue-设置不同环境的打包和运行
前端·javascript·vue.js
qq_419854054 小时前
CSS动效
前端·javascript·css
烛阴4 小时前
3D字体TextGeometry
前端·webgl·three.js
桜吹雪4 小时前
markstream-vue实战踩坑笔记
前端
南村群童欺我老无力.5 小时前
Flutter应用鸿蒙迁移实战:性能优化与渐进式迁移指南
javascript·flutter·ci/cd·华为·性能优化·typescript·harmonyos
C_心欲无痕5 小时前
nginx - 实现域名跳转的几种方式
运维·前端·nginx