大家好,我是江城开朗的豌豆,一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术,并深入掌握Vue、React、Uniapp、Flutter等主流框架,能够高效解决各类前端开发问题。在我的技术栈中,除了常见的前端开发技术,我还擅长3D开发,熟练使用Three.js进行3D图形绘制,并在虚拟现实与数字孪生技术上积累了丰富的经验,特别是在虚幻引擎开发方面,有着深入的理解和实践。
我一直认为技术的不断探索和实践是进步的源泉,近年来,我深入研究大数据算法的应用与发展,尤其在数据可视化和交互体验方面,取得了显著的成果。我也注重与团队的合作,能够有效地推动项目的进展和优化开发流程。现在,我担任全栈工程师,拥有CSDN博客专家认证及阿里云专家博主称号,希望通过分享我的技术心得与经验,帮助更多人提升自己的技术水平,成为更优秀的开发者。
技术qq交流群:906392632
大家好,我是小杨,一个在前端圈子里摸爬滚打多年的开发者。今天咱们来聊聊 JavaScript的数据类型,以及如何准确判断它们。
你是不是也遇到过这样的场景?
- 代码里明明是个数字,
typeof却告诉你它是"object"? - 用
==比较变量时,0和false竟然相等? - 想判断一个变量是不是数组,结果发现
typeof []返回"object"?
别慌!今天我们就来彻底搞懂JS的数据类型,以及如何正确判断它们。
一、JS有哪些数据类型?
JS的数据类型可以分为两大类:
- 基本类型(Primitive Types)
- 引用类型(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 Array → true |
能判断引用类型 | 不能用于基本类型 |
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() |
| 对象/函数 | instanceof 或 toString.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"
四、常见坑点
-
typeof null返回"object"- 这是JS的历史遗留问题,只能用
=== null判断。
- 这是JS的历史遗留问题,只能用
-
[] instanceof Object返回true- 因为数组也是对象,所以要用
Array.isArray()更准确。
- 因为数组也是对象,所以要用
-
==会进行隐式类型转换javascriptconsole.log(0 == false); // true(因为0和false都会转成0) console.log("" == false); // true(空字符串和false都会转成0)建议用
===严格比较。
五、总结
-
基本类型 :
number、string、boolean、undefined、null、symbol、bigint。 -
引用类型 :
object(包括数组、函数等)。 -
判断方法:
typeof→ 适合基本类型(除null)。instanceof→ 适合引用类型(如数组、函数)。Object.prototype.toString.call()→ 终极方案,最精准。Array.isArray()→ 专门判断数组。
现在,你是不是对JS的数据类型和判断方法更清晰了?如果有疑问,欢迎在评论区交流! 🚀