JS—如何判断数据类型:全能判断方式Object.prototype.toString.call()

ops/2025/3/15 21:17:53/

个人博客:haichenyi.com。感谢关注

1. 目录

  • 1–目录
  • 2–typeof 操作符
  • 3–instanceof 操作符
  • 4–Object.prototype.toString.call()
  • 5–Array.isArray()
  • 6–=== 严格相等
  • 7–constructor 属性
  • 8–Symbol.toStringTag(ES6+)

2. typeof 操作符

​功能:检测基本数据类型。
返回结果:返回类型字符串(如 “number”, “string”)
特点:
  无法区分 null(返回 “object”)和对象类型。
  无法区分数组、对象、日期等引用类型(均返回 “object”)。

console.log(typeof 42);          // "number"
console.log(typeof "hello");     // "string"
console.log(typeof true);        // "boolean"
console.log(typeof undefined);   // "undefined"
console.log(typeof null);        // "object" (历史遗留问题)
console.log(typeof []);          // "object"
console.log(typeof {});          // "object"

typeof结果图

3. instanceof 操作符

功能:检测对象是否为某个构造函数的实例
​特点:
  用于检测引用类型(如数组、自定义对象)。
  无法检测基本数据类型。
  跨窗口/框架时可能失效(不同全局环境下的构造函数不同)

console.log([] instanceof Array);       // true
console.log({} instanceof Object);       // true
console.log(new Date() instanceof Date); // truefunction Person() {}
const person = new Person();
console.log(person instanceof Person);  // true

instanceof结果图

4. Object.prototype.toString.call()

功能:最精确的类型检测方法,可区分所有内置对象。
返回结果:格式为 [object Xxx](如 [object Array])。
​特点:
  适用于检测所有数据类型(包括基本类型和引用类型)。
  可识别 null 和 undefined。

console.log(Object.prototype.toString.call(42));          // "[object Number]"
console.log(Object.prototype.toString.call("hello"));     // "[object String]"
console.log(Object.prototype.toString.call(null));        // "[object Null]"
console.log(Object.prototype.toString.call(undefined));   // "[object Undefined]"
console.log(Object.prototype.toString.call([]));          // "[object Array]"
console.log(Object.prototype.toString.call({}));          // "[object Object]"
console.log(Object.prototype.toString.call(new Date()));  // "[object Date]"

Object.prototype.toString.call()结果图

5. Array.isArray()

功能:专门检测变量是否为数组
​特点:
  ES5 引入,比 instanceof 更可靠(避免跨窗口问题)。
  替代旧方法 arr instanceof Array。

console.log(Array.isArray([]));     // true
console.log(Array.isArray({}));     // false

Array.isArray()结果图

6. === 严格相等

功能:检测 null 或 undefined
​特点:
  null 和 undefined 无法用 typeof 准确检测。
  直接使用严格相等判断。

const value = null;
console.log(value === null);        // true
const value2 = undefined;
console.log(value2 === undefined); // true

=== 严格相等结果图

7. constructor 属性

功能:通过对象的构造函数属性判断类型。
​特点:
  不推荐使用,因为 constructor 可被修改。
  对基本数据类型无效(如 42.constructor 会报错)。

const arr = [];
console.log(arr.constructor === Array); // trueconst obj = {};
console.log(obj.constructor === Object); // true// 可能被篡改
arr.constructor = Object;
console.log(arr.constructor === Array);  // false

constructor 属性结果图

8. Symbol.toStringTag

​功能:允许对象自定义 Object.prototype.toString 返回的标签。
​特点:
  用于高级场景(如自定义类)。
  不影响 typeof 或 instanceof。

class MyClass {get [Symbol.toStringTag]() {return "MyClass";}
}
const obj = new MyClass();
console.log(Object.prototype.toString.call(obj)); // "[object MyClass]"

Symbol.toStringTag结果图
PS:整篇文章,精炼一下,如下
方法对比与选择指南

检测方式​适用场景注意事项
typeof检测基本数据类型(除null)无法区分null和对象
instanceof检测引用类型(如数组,自定义对象)无法检测基本数据类型,跨窗口失效
Object.prototype.toString.call()精确检测所有类型,推荐需配合.call方法使用
Array.isArray()检测数组只能用于检测数组,无法检测其他
=== 严格相等检测null和undefined只能检测这两个类型,无法检测其他
constructor 属性快速检测已知构造函数构造函数可被篡改,不推荐
Symbol.toStringTag自定义对象的类型标签高级用法,兼容性需注意

最佳实践
​a. 基本类型:使用 typeof(注意 null 的陷阱)。
b. ​引用类型:优先使用 Object.prototype.toString.call()。
​c. 数组检测:使用 Array.isArray()。
d. ​null/undefined:直接使用 === 判断。
​f. 自定义类型:结合 instanceof 和 Symbol.toStringTag


http://www.ppmy.cn/ops/166042.html

相关文章

【网络通信安全】子专栏链接及简介

目录 操作系统安全:筑牢网络安全根基​ 网络协议安全:守护数据传输通道​ Web 站点安全开发:打造安全的网络交互平台​ 在数字化浪潮席卷的当下,网络通信已深度融入生活与工作的方方面面,从日常的线上购物、社交互动…

Linux网络套接字编程——UDP服务器

Linux网络套接字编程——创建并绑定-CSDN博客 前面已经介绍了网络套接字的创建和绑定,这篇文章会通过UDP套接字实现一个UDP服务器。 先介绍将使用的接口。 recvfrom ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr,…

2011-2020年 全国省市县-数字普惠金融指数数字经济指数绿色金融指数县域数字乡村指数

2011-2020 全国省市县-数字普惠金融指数&数字经济指数&绿色金融指数&县域数字乡村指数https://download.csdn.net/download/2401_84585615/90214687 https://download.csdn.net/download/2401_84585615/90214687 在2011年至2020年期间,中国各省、市、县…

Java---JavaSpringMVC解析(1)

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC" 1.MVC MVC是Model View Controller的缩写&#…

数组的介绍

1.数组的概念 数组是一组相同类型元素的集合,从这个描述中我们知道: 数组中存放1个或多个数据,但是数组的元素个数不为0。数组中存放的多个数据,类型是相同的。 数组分为一维数组和多维数组,多维数组一般比较多见的…

大模型微调中warmup(学习率预热)是什么

大模型微调中warmup(学习率预热)是什么 在大模型微调中,添加warmup(学习率预热)是指在训练初期逐步增加学习率,避免直接使用高学习率导致参数震荡。 🔧 为什么需要warmup? 大模型参数敏感:预训练模型的参数已接近最优,初期用大学习率可能剧烈扰动参数(如“急刹车…

3.JVM-内部结构

1.栈结构 1.1 动态链接 栈中的对象指向堆中的实际引用 符号引用: 比如一个类的名称 直接引用: 具体堆中数据信息 1.2 方法返回 栈中上一层的结果和下一层的指令 1.3 操作数栈 1.4 局部变量 该线程中需要的变量 2. 虚拟机栈是如何工作 程序计数器:存当前执行到那一步 操作…

手写一个Tomcat

Tomcat 是一个广泛使用的开源 Java Servlet 容器,用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂,但通过手写一个简易版的 Tomcat,我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat,并深…