当前位置:网站首页 > 技术博客 > 正文

js实现数据类型判断



在 编程中, 正确判断数据类型是必备技能, 也是面试常问的内容。本文将探讨 常用的数据类型判断方法:

  1. typeof
  2. instanceof & isPrototypeOf()
  3. constructor
  4. Object.prototype.toString.call()

通过了解它们的特点和适用范围, 能够更好地处理不同数据类型的情况, 避免出现错误和提升代码质量

运算符返回一个字符串, 表示操作数的类型, 使用语法:

1.1 规则

下表, 是 针对不同数据类型, 返回的结果值

类型 结果 “” “” “” “” “” “” “” (在 也是函数) “” 其他任何对象 “”

示例代码如下:

 
  

1.2 为什么「typeof null」等于「object」

 
  
  1. 在 中 的结果为 , 这是从 的第一版遗留至今的一个
  2. 在 最初的实现中, 中的值是由一个表示类型的 和 表示的, 对象的 是 , 由于 代表的是空指针, 在大多数平台下值表示为 , 因此, 的 是 , 因此 也就返回了
  3. 当然针对这个 曾有一个 的修复提案, 但是被拒绝了, 原因是遗留代码太多了, 如果修改的话影响太广, 不如继续将错就错当个和事老

image

1.3 为什么「typeof (() => {})」等于 「function」

首先我们需要了解一个小知识, 函数是什么? 为什么被调用?

实际上是 的一个 , 更深点说, 函数是一个可以被调用的对象; 那么它为什么能够被调用呢? 那是因为其内部实现了 方法, 当函数对象被调用时会执行内部方法

image

那么回到正题, 为什么 会返回 ? 这里主要还是要看 中 是如何区分函数和对象类型的:

  • 一个对象如果没有实现 内部方法, 那么它就返回
  • 一个对象如果实现了 内部方法, 那么它就返回

1.4 注意事项

  1. 所有使用 创建的数据, 都会返回 或
 
  
  1. 操作符的优先级高于 等 , 因此, 必要时候记得用括号
 
  

在 中我们有 方式可以判断 是否存在于某个 的 上, 通过这种判断就可以帮助我们, 确定 的具体类型; 需要注意的是该方法 , 无法判断 类型

2.1 instanceof

  1. 介绍: 运算符用于检测 的 属性是否出现在 对象的 上
  2. 语法: , 返回一个 值
  3. 示例:
 
  

2.2 Object.prototype.isPrototypeOf()

  1. 介绍: 方法用于检查一个 是否存在于 的原型链中
  2. 语法: , 返回一个布尔值
  3. 示例:
 
  

关于原型、原型链更多知识可查阅 《原型、原型链》

判断方法跟 相似, 如下图是 、、 之间的一个关系图, 从图可知, 在 中存在 指向 , 那么借用这个特性我们可以用于判断 类型

image

 
  

不同于 , 通过该方式既可以处理 、又能够处理

 
  

不同于 , 不能判断

 
  

注意: 和 没有 , 所以它是无法检测

关于原型、原型链更多知识可查阅 《原型、原型链》

方法返回一个表示该对象的字符串, 该字符串格式为 , 这里的 就是对象的类型

 
  

注意: 对于自定义构造函数实例化出来的对象, 返回的是

 
  

默认, 如果一个对象有 属性并且该属性值是个字符串, 那么这个属性值, 会被用作 返回内容的 值进行展示

 
  

补充: 一个通用方法, 一行代码获取

 
  
判断方法 基本类型 引用类型 父类 null undefined ✅ ❌ ❌ ❌ ✅ ❌ ✅ ✅ ❌ ❌ ✅ ✅ ❌ ❌ ❌ ✅ ✅ ❌ ✅ ✅
  1. 适合用于判断 , 特别的是: 会返回 、 返回 、其余 都返回
  2. 可以用于判断引用数据的类型, 同时可判断
  3. 可用于基本类型、引用类型, 但是不可判断 、, 并且无法判断
  4. 万能方法, 对于 中所有类型都能够识别出来, 唯一不足的可能是无法判断 (但是问题不大)
  • JavaScript 的 typeof 原理小记
  • 如何正确判断JS的数据类型
  • js判断数据类型常用的6种方法

image

版权声明


相关文章:

  • mysql触发器 sql2025-06-17 12:01:04
  • 图像滤波是什么意思2025-06-17 12:01:04
  • shellcode加密2025-06-17 12:01:04
  • winpcap抓包软件编程2025-06-17 12:01:04
  • xml文件注释掉多行2025-06-17 12:01:04
  • 旁路电容和去耦电容作用和区别2025-06-17 12:01:04
  • 抽象类在java中表示一种继承关系?2025-06-17 12:01:04
  • 线程同步的方法 java2025-06-17 12:01:04
  • 基于ds1302与数码管的可调时钟2025-06-17 12:01:04
  • python中pop函数的作用2025-06-17 12:01:04