JavaScript 中的数据类型分为基本类型(Primitive) 和引用类型(Object)。基本类型直接存储于栈内存,按值访问,不可变(一旦创建就无法被修改)。理解它们的特性和差异,是写出稳健代码的第一步。
Undefined 类型
Undefined 类型只有一个值 undefined。当一个变量被声明但未赋值时,它的值就是 undefined。
let a;
console.log(a); // undefined
常见出现场景:
- 变量声明未初始化
- 函数没有返回值时,默认返回
undefined - 对象中不存在的属性,访问结果为
undefined - 函数参数未传递时,对应形参为
undefined
实用注意:
不要主动将变量赋值为 undefined,让它的语义保持为“缺少值”的系统默认状态。如果需要明确表示“空值”,使用 null。
Null 类型
Null 类型也只有一个值 null。它表示一个被明确赋予的“空”,代表“无对象引用”或“故意留空”。
let obj = null; // 明确指示 obj 应该是对象,但当前为空
历史小坑:typeof null 返回 "object",这是 JavaScript 语言设计上的一个遗留 bug。判断一个值是否为 null 应使用严格相等 === null。
Boolean 类型
Boolean 类型只有两个字面值:true 和 false。常出现在条件语句中,许多类型的值可以被转换为布尔值。
以下值转换为 false(falsy 值):
false、0、-0、0n(BigInt 零)、""(空字符串)、null、undefined、NaN
其余所有值转换为 true(truthy 值),包括空对象 {} 和空数组 []。
if ({}) {
console.log("执行了"); // 一定会输出
}
Number 类型
Number 类型基于 IEEE 754 双精度浮点数标准,整数和浮点数统一存储。核心特点:
- 整数范围安全:
Number.MAX_SAFE_INTEGER(2⁵³ - 1)和Number.MIN_SAFE_INTEGER(-2⁵³ + 1),超出此范围的整数运算可能不精确。 - 浮点数存在精度问题,经典案例
0.1 + 0.2 !== 0.3。 - 特殊值:
Infinity、-Infinity、NaN(Not a Number)。
判断 NaN 只能用 isNaN() 或 Number.isNaN(),因为 NaN === NaN 为 false。
const result = 0 / 0; // NaN
console.log(result === result); // false
console.log(Number.isNaN(result)); // true
BigInt 类型
BigInt(ES2020 引入)用来表示任意大的整数,弥补 Number 类型的整数范围限制。创建方式:整数后加 n 或使用 BigInt() 函数。
const big = 9007199254740991n + 1n; // 可以精确运算
const alsoBig = BigInt("9007199254740992");
重要约束:
- 不能与普通 Number 直接混合运算,需显式转换。
- 除法结果会向零取整。
- 不支持
Math对象中的绝大多数方法。
String 类型
字符串表示文本数据,由 16 位无符号整数组成的不可变序列。可用单引号、双引号、反引号(模板字符串)表示。
const name = "JavaScript";
const greeting = `Hello, ${name}!`; // 模板字符串支持插值
length属性表示字符数量(实际上是 16 位码元的个数,某些表情符号等可能占用两个码元)。- 字符串不可变:任何返回新字符串的方法都不会修改原字符串。
Symbol 类型
Symbol(ES6 引入)表示唯一且不可变的值,常用来创建对象的唯一属性键,以免属性名冲突。
const sym1 = Symbol("id");
const sym2 = Symbol("id");
console.log(sym1 === sym2); // false,每次调用 Symbol() 都返回新的唯一符号
全局共享符号:
使用 Symbol.for("key") 可在全局注册表中查找或创建同一字符串对应的同一个符号。
常用内置符号:Symbol.iterator、Symbol.toStringTag、Symbol.species 等,用于元编程,定制对象的内置行为。
基本类型总结
- 不可变性:基本类型的值一旦创建就无法改变,所有操作都会产生新值。
- 按值比较:基本类型比较时直接比较值(
===),而非引用。 - 包装对象:当对基本类型调用方法时,JS 会临时创建一个对应的包装对象(String、Number 等),用完即销毁,体现了“自动装箱”机制。
理解这些基本类型是深入学习类型转换、内存管理以及后续复杂数据结构的基础。下一节我们将继续探讨引用类型 Object,以及两种类型之间的关键差异。