JavaScript 的数据类型可以分为两大类:原始类型(Primitive Types) 和 对象类型(Object Type)。
一、原始类型(Primitive Types)
原始类型是不可变的(immutable),存储在栈内存中。它们的值直接存储在变量中。
1. string(字符串)
- 表示文本数据。
- 用单引号、双引号或反引号(模板字符串)定义。
- 示例:
"hello",'world',`template ${var}`
2. number(数字)
- 表示整数、浮点数、
NaN、Infinity、-Infinity。 - 所有数字在 JavaScript 中都是 64 位双精度浮点数(IEEE 754)。
- 示例:
42,3.14,NaN,Infinity
3. boolean(布尔值)
- 表示逻辑值:
true或false。 - 示例:
true,false
4. undefined(未定义)
- 表示变量已声明但未赋值,或对象属性不存在。
- 是其自身的类型。
- 示例:
let x;
console.log(x); // undefined
5. null(空值)
- 表示“有意的空值”或“无对象”。
- 是一个原始值,但
typeof null返回"object"(历史 bug)。 - 示例:
let user = null;
6. symbol(符号,ES6 引入)
- 表示唯一的、不可变的值,常用于对象属性键,避免命名冲突。
- 示例:
const id = Symbol('id');
const obj = { [id]: '123' };
7. bigint(大整数,ES2020 引入)
- 表示任意精度的整数,用于超出
Number.MAX_SAFE_INTEGER的大数。 - 通过在整数后加
n创建。 - 示例:
123n,BigInt(9007199254740991)
✅ 原始类型共 7 种:
string,number,boolean,undefined,null,symbol,bigint
二、对象类型(Object)
- 对象是可变的(mutable),存储在堆内存中,变量中存储的是指向对象的引用。
- 包括:
- 普通对象
{}、new Object() - 数组
[]、new Array() - 函数
function() {}、new Function() - 日期
new Date() - 正则表达式
/abc/ Map,Set,WeakMap,WeakSet等 ES6 新增结构
- 普通对象
⚠️ 注意:函数在 JavaScript 中是一等公民,是对象的一种特殊类型。
三、关键区别对比
| 特性 | 原始类型(Primitives) | 对象类型(Objects) |
|---|---|---|
| 存储方式 | 栈内存(直接存储值) | 堆内存(存储引用,值在堆中) |
| 可变性 | 不可变(immutable) | 可变(mutable) |
| 赋值行为 | 值传递(复制值) | 引用传递(复制引用) |
typeof 返回值 | 各自的类型(如 "string") | "object"(函数除外,返回 "function") |
| 相等比较 | 值相等(=== 比较值) | 引用相等(=== 比较是否是同一对象) |
| 原型 | 原始值有对应的包装对象(如 String, Number),但自动装箱 | 有原型链(__proto__) |
示例:值传递 vs 引用传递
// 原始类型:值传递
let a = 10;
let b = a;
b = 20;
console.log(a); // 10(a 不受影响)
// 对象类型:引用传递
let obj1 = { name: "Alice" };
let obj2 = obj1;
obj2.name = "Bob";
console.log(obj1.name); // "Bob"(obj1 被修改)
四、如何判断数据类型?
| 方法 | 说明 |
|---|---|
typeof value | 适用于原始类型(但 typeof null === "object" 是 bug) |
Array.isArray(value) | 判断是否为数组 |
value instanceof Constructor | 判断对象是否为某构造函数的实例 |
Object.prototype.toString.call(value) | 最可靠,可精确判断所有内置类型 |
五、总结
| 问题 | 回答 |
|---|---|
| JavaScript 有哪些数据类型? | 7 种原始类型:string, number, boolean, undefined, null, symbol, bigint1 种对象类型:object(包含数组、函数、日期等) |
| 核心区别 | 原始类型是不可变的值,对象是可变的引用。 |
一句话:JavaScript 有 7 种原始类型和 1 种对象类型,区别在于存储方式、可变性和赋值行为。原始类型按值传递,对象按引用传递。
THE END


