JavaScript篇:JS数据类型大乱斗:谁才是类型判断的王者?

大家好,我是江城开朗的豌豆,一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术,并深入掌握Vue、React、Uniapp、Flutter等主流框架,能够高效解决各类前端开发问题。在我的技术栈中,除了常见的前端开发技术,我还擅长3D开发,熟练使用Three.js进行3D图形绘制,并在虚拟现实与数字孪生技术上积累了丰富的经验,特别是在虚幻引擎开发方面,有着深入的理解和实践。

我一直认为技术的不断探索和实践是进步的源泉,近年来,我深入研究大数据算法的应用与发展,尤其在数据可视化和交互体验方面,取得了显著的成果。我也注重与团队的合作,能够有效地推动项目的进展和优化开发流程。现在,我担任全栈工程师,拥有CSDN博客专家认证及阿里云专家博主称号,希望通过分享我的技术心得与经验,帮助更多人提升自己的技术水平,成为更优秀的开发者。

技术qq交流群:906392632

大家好,我是小杨,一个在前端圈子里摸爬滚打多年的开发者。今天咱们来聊聊 JavaScript的数据类型,以及如何准确判断它们。

你是不是也遇到过这样的场景?

  • 代码里明明是个数字,typeof 却告诉你它是 "object"
  • == 比较变量时,0false 竟然相等?
  • 想判断一个变量是不是数组,结果发现 typeof [] 返回 "object"

别慌!今天我们就来彻底搞懂JS的数据类型,以及如何正确判断它们。


一、JS有哪些数据类型?

JS的数据类型可以分为两大类:

  1. 基本类型(Primitive Types)
  2. 引用类型(Reference Types)

1. 基本类型(值类型)

  • number(数字)
  • string(字符串)
  • boolean(布尔值)
  • undefined(未定义)
  • null(空值)
  • symbol(ES6新增,唯一标识符)
  • bigint(ES11新增,大整数)

特点:

  • 存储在栈内存,直接访问值。
  • 赋值时是值拷贝,修改不会影响原变量。
javascript 复制代码
let age = 18;  
let newAge = age;  
newAge = 20;  

console.log(age); // 18(原值不变)
console.log(newAge); // 20

2. 引用类型(对象类型)

  • object(普通对象、数组、函数、日期等)

特点:

  • 存储在堆内存 ,变量存储的是内存地址
  • 赋值时是引用拷贝,修改会影响原变量。
javascript 复制代码
let me = { name: "我", age: 18 };  
let you = me;  
you.age = 20;  

console.log(me.age); // 20(原对象被修改)
console.log(you.age); // 20

二、如何判断数据类型?

JS提供了好几种判断数据类型的方法,但各有优缺点:

方法 示例 优点 缺点
typeof typeof 123"number" 能识别基本类型 typeof null"object"
instanceof [] instanceof Arraytrue 能判断引用类型 不能用于基本类型
Object.prototype.toString.call() toString.call([])"[object Array]" 最精准 写法稍复杂
Array.isArray() Array.isArray([])true 专门判断数组 只能用于数组

1. typeof ------ 基本类型的首选

javascript 复制代码
console.log(typeof 123); // "number"  
console.log(typeof "我"); // "string"  
console.log(typeof true); // "boolean"  
console.log(typeof undefined); // "undefined"  
console.log(typeof null); // "object"(历史遗留bug!)  
console.log(typeof []); // "object"(不能区分数组和对象)  
console.log(typeof function() {}); // "function"  

适用场景 :判断基本类型(除了 null)。

2. instanceof ------ 引用类型的判断

javascript 复制代码
console.log([] instanceof Array); // true  
console.log({} instanceof Object); // true  
console.log(function() {} instanceof Function); // true  
console.log(123 instanceof Number); // false(基本类型不行)  

适用场景:判断对象的具体类型(如数组、函数)。

3. Object.prototype.toString.call() ------ 终极方案

javascript 复制代码
console.log(Object.prototype.toString.call(123)); // "[object Number]"  
console.log(Object.prototype.toString.call("我")); // "[object String]"  
console.log(Object.prototype.toString.call([])); // "[object Array]"  
console.log(Object.prototype.toString.call(null)); // "[object Null]"  

适用场景:最精准的判断方式,适用于所有类型。

4. Array.isArray() ------ 数组专用

javascript 复制代码
console.log(Array.isArray([])); // true  
console.log(Array.isArray({})); // false  

适用场景 :专门判断数组,比 instanceof 更可靠。


三、总结:如何选择判断方法?

数据类型 推荐判断方式
基本类型 typeof(注意 null 要用 ===
数组 Array.isArray()toString.call()
对象/函数 instanceoftoString.call()
终极方案 Object.prototype.toString.call()

代码示例

javascript 复制代码
function getType(data) {
  if (data === null) return "null"; // 单独处理null
  if (typeof data !== "object") return typeof data; // 基本类型
  return Object.prototype.toString.call(data).slice(8, -1).toLowerCase();
}

console.log(getType(123)); // "number"  
console.log(getType("我")); // "string"  
console.log(getType([])); // "array"  
console.log(getType(null)); // "null"  

四、常见坑点

  1. typeof null 返回 "object"

    • 这是JS的历史遗留问题,只能用 === null 判断。
  2. [] instanceof Object 返回 true

    • 因为数组也是对象,所以要用 Array.isArray() 更准确。
  3. == 会进行隐式类型转换

    javascript 复制代码
    console.log(0 == false); // true(因为0和false都会转成0)
    console.log("" == false); // true(空字符串和false都会转成0)

    建议用 === 严格比较。


五、总结

  • 基本类型numberstringbooleanundefinednullsymbolbigint

  • 引用类型object(包括数组、函数等)。

  • 判断方法

    • typeof → 适合基本类型(除 null)。
    • instanceof → 适合引用类型(如数组、函数)。
    • Object.prototype.toString.call() → 终极方案,最精准。
    • Array.isArray() → 专门判断数组。

现在,你是不是对JS的数据类型和判断方法更清晰了?如果有疑问,欢迎在评论区交流! 🚀

相关推荐
Nan_Shu_61415 小时前
学习:Vue (2)
javascript·vue.js·学习
武清伯MVP15 小时前
深入了解Canvas:HTML5时代的绘图利器(一)
前端·html5·canvas
一水鉴天15 小时前
整体设计 定稿 之24 dashboard.html 增加三层次动态记录体系仪表盘 之2 程序 (Q208 之1)
前端·html
_杨瀚博15 小时前
微信支付集成_JSAPI
前端
polaris_tl15 小时前
react beginwork
前端
亮子AI15 小时前
【css】列表的标号怎么实现居中对齐?
前端·css
梦想的旅途216 小时前
媒体文件(图片/文件)的上传与管理:获取 Media ID 的技术细节
前端·http·servlet
一水鉴天16 小时前
整体设计 定稿 之22 dashboard.html 增加三层次动态记录体系仪表盘 之1
前端·html
张拭心16 小时前
程序员越想创业,越不要急着动手
前端·人工智能
舒一笑16 小时前
在低配云服务器上实现自动化部署:Drone CI + Gitee Webhook 的轻量级实践
前端·后端·程序员