怎样判断一个变量是数组还是函数还是对象呢?

检测数据类型

怎样判断一个变量是数组还是函数还是对象? 这无疑是要我们判断数据类型

typeof

讲到我们首先想到的肯定是typeof

但是typeof检测具有局限性 , 他不能准确的检测数组和对象

typeof 复制代码
// 检测数组 返回'object'
typeof [1,2,3] //'object'
// 检测对象 返回'object'
typeof {a:1,b:2} //'object'
// 检测函数 返回'Function'
typeof function abc() {} //'Function'

总结一下:

  • typeof 检测数组和对象时返回值都是 object , 无法精确区分数组和对象
  • 拓展:typeof检测 null 返回值也是 object

instanceof

既然typeof不能判断一个变量到底是数组、对象还是函数 , 那么我们就尝试一下 instanceof

instanceof 用于判断一个变量是否属于某个对象的实例 , 返回值是 布尔值

instanceof 复制代码
const arr = [2,3,4]
const obj = { a : 1 , b : 2 }
const fn = function abc(){}
// 1.检测arr数组是否为数组类型
[2,3,4] instanceof Array  // true
// 2.检测object对象是否为对象类型
obj instanceof Object  // true
// 3.检测fn函数是否为函数类型
fn instanceof Function // true

总结一下:

  • instanceof关键字主要用于判断一个对象是否属于某个类或其子类的实例 , 他可以用来判断一个变量是数组还是对象 , 返回的是一个布尔值 ;
  • 因为instanceof返回的值是一个布尔值 , 他是这样判断的 :
    数组 instanceof Array对象 instanceof Object函数 instanceof Function
    即 => 数组是否是数组 , 对象是否是对象 ;
  • 更多的是一个判断结果 , 我个人认为用instanceof来判断一个变量到底是数组、对象还是函数有点脱裤子放屁--多此一举 , 不是一个良方

Object.prototype.toString.call()

不知道小伙伴们有没有用过 Object.prototype.toString.call() 这个方法 , 他可以精准判断变量类型,它返回 [object constructorName] 的字符串格式,这里的constructorName就是call参数的函数名

下面让我们尝试一下这个陌生又熟悉的方法 :

Object.prototype.toString.call() 复制代码
// 1.检测数组
Object.prototype.toString.call([1,2,3])  // '[object Array]'
// 2.检测对象
Object.prototype.toString.call({a:1})  // '[object Object]'
// 1.检测函数
Object.prototype.toString.call(function abc(){})  // '[object Function]'

总结一下 :

  • Object.prototype.toString.call())的作用是获取一个对象的类型
  • 通过调用Object对象原型上的 toString() 方法,并传入要检测的对象作为参数,返回一个表示对象类型的字符串。
  • 这个方法可以用来判断一个对象的类型,包括原始类型(如字符串、数字、布尔值等)和复杂类型(如数组、函数、日期等)

综合来看 Object.prototype.toString.call() 是解决这个问题的最佳方案

相关推荐
其美杰布-富贵-李16 小时前
第 6 篇:相机与 OrbitControls
前端·javascript·three.js
lichenyang45316 小时前
从图片生成任务到用户隔离:AIGC Creative Studio 后端与 PostgreSQL 建模实践
前端·后端
小黑技术栈17 小时前
关于前端的一些话
前端
无人生还17 小时前
从 Vue3 到 React · 快速上手系列第 11 篇:状态管理
前端·vue.js·react.js
GuWenyue17 小时前
90%前端写React TS都踩坑!一套父子组件+Hooks完整实战,彻底搞懂类型约束
前端·react.js
Hilaku17 小时前
当 AI 一天写完一周的代码,我们还剩什么优势?
前端·javascript·程序员
尘世中一位迷途小书童17 小时前
无人机航线里的云台角度怎么调?Cesium 做了个视锥 + 鹰眼联动
前端·javascript·数据可视化
思码梁田17 小时前
CSS display 属性:从元素类型转换到隐藏元素的实用指南
前端·css·display·inline·block·none·inline-block
Csvn17 小时前
⚡ Vite 依赖预构建(optimizeDeps)的 3 个经典坑:改了源码不生效、新增依赖 404、缓存怎么清都不行
前端
A242073493018 小时前
Vue3 + TypeScript:后端数据在表格内渲染后进行增删改的完整实现步骤
前端·javascript·typescript