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 , bigint 1 种对象类型:object (包含数组、函数、日期等) |
核心区别 | 原始类型是不可变的值,对象是可变的引用。 |
一句话:JavaScript 有 7 种原始类型和 1 种对象类型,区别在于存储方式、可变性和赋值行为。原始类型按值传递,对象按引用传递。
THE END