JavaScript基本数据类型有哪些:7种原始类型详解
在当前 ECMAScript 规范定义中,JavaScript 的数据类型总共分为两大类:原始类型(Primitive Types,亦称基本数据类型)和引用类型(Object,对象类型)。其中,基本数据类型共有 7 种,分别是:Undefined、Null、Boolean、Number、BigInt、String 和 Symbol。本文直接针对这 7 种类型展开逐一解析,说明各自的取值特征、实际应用场景、内存存储方式,以及类型判断时必须留意的语言陷阱。
一、什么是“原始类型”?它与对象的核心区别
理解 7 种基本数据类型之前,需要先建立一个认知:原始类型的值是不可变的,并且按值访问。
当声明一个原始类型的变量时,变量直接存储该值的实际内容。如果把这个变量赋值给另一个变量,JavaScript 引擎会完整复制一份独立的值,两个变量后续互不影响。而引用类型(对象、数组)存储的是内存堆中的地址指针,赋值操作仅仅是复制引用地址。
二、7种原始类型逐一详解
1. Undefined:未定义
Undefined 类型只有一个取值,即小写的 undefined。它表示“此处应该有值,但尚未被定义或赋值”。
在以下几种常见场景中,JavaScript 运行环境会自动产生 undefined:
- 使用
let或var声明了变量,但未对其赋予初始值; - 访问对象上一个不存在的属性;
- 调用函数时没有提供对应的实参,对应的形参即为
undefined; - 一个函数内部没有显式执行
return语句,或仅仅写了return;。
let currentStatus;
console.log(currentStatus); // undefined
function calculateSum(a, b) {
console.log("形参 b 的值:", b);
}
calculateSum(10); // 形参 b 的值: undefined
形参 b 的值: undefined
2. Null:空值
Null 类型也只有一个值,即 null。它在语义上表示“一个有意设置为空的对象引用”或“空值占位符”。
与 Undefined 的明确分工:
undefined代表系统级、非预期的“缺省”,通常是变量未初始化或缺失输入时的默认表现。null代表程序级、有意的“主动清空”。当准备释放一个对象引用的占用,或函数查询不到满足条件的对象时(例如原生 DOM 查询document.getElementById('not-exist')),会主动返回或赋予null。
let currentUser = { id: 1001, name: "Wang Li" };
// 主动切断引用,标记该变量不再关联任何对象
currentUser = null;
在 JavaScript 中执行
typeof null,得到的结果是 "object"。这是自 JavaScript 初版设计保留至今的底层 Bug(由于早期用 32 位单元存储变量时,对象前三位二进制标志是 000,而 null 表示空指针也恰为全 0,被误判为对象)。规范出于向后兼容考虑未做修正。切记:null 是基础类型,绝不是对象。
3. Boolean:布尔值
Boolean 类型只有两个确定值:true(真)和 false(假),用于程序的分支控制与逻辑判断。
在编写条件语句(如 if、三元运算符)时,任意非布尔值都会触发隐式类型转换。在 JavaScript 中,只有以下 8 个值会被强制判定为“假值(Falsy)”,其余所有值均为“真值(Truthy)”:
false0、-0、0n(BigInt 的 0)""(空字符串)nullundefinedNaNdocument.all(浏览器环境历史特例)
4. Number:双精度浮点数
在很多传统语言(如 C、Java)中,整数与浮点数被细分为 int、float、double 等。而在 JavaScript 中,常规数值统一采用 IEEE 754 标准的 64 位双精度浮点数表示,没有单独的内置整型。
Number 类型包含常规有限数字,以及三个特殊符号值:
Infinity:正无穷大(例如正数除以 0:10 / 0);-Infinity:负无穷大;NaN(Not-a-Number):非数值。当执行无效的数学计算(如"abc" - 5或0 / 0)时返回。
// 经典精度问题
console.log(0.1 + 0.2 === 0.3); // false
console.log(0.1 + 0.2); // 0.30000000000000004
// NaN 的特性:自己不等于自己
console.log(NaN === NaN); // false
console.log(Number.isNaN(NaN)); // true (官方推荐判断方式)
0.30000000000000004
false
true
5. BigInt:任意精度整数
BigInt 是 ECMAScript 2020(ES11)引入的新基本数据类型。由于 Number 类型受限于 64 位浮点数结构,能精确表示的最大安全整数范围为 -(2^53 - 1) 到 2^53 - 1(即 Number.MAX_SAFE_INTEGER = 9007199254740991)。一旦业务涉及超出该范围的高精度 ID(如分布式 Snowflake ID、金融账户金额),直接用 Number 处理会发生截断丢失。
创建 BigInt 只需在整数字面量末尾加上 n,或调用 BigInt() 构造函数:
const safeNumber = 9007199254740991;
console.log(safeNumber + 1 === safeNumber + 2); // true (精度丢失)
const bigIntVal = 9007199254740991n;
console.log(bigIntVal + 1n === bigIntVal + 2n); // false (正确计算)
BigInt 不能与常规 Number 混合进行隐式直接运算(例如
10n + 5 会抛出 TypeError),必须使用 Number() 或 BigInt() 主动转换同类。此外,BigInt 不支持包含小数。
6. String:字符串
String 用于表示文本数据,由一组 16 位的 Unicode 字符组成。可以通过单引号 ''、双引号 "" 或 ES6 模板字符串 `` 声明。
核心特性:字符串的不可变性(Immutable)。一旦创建,其在内存中的内容无法直接修改。所有针对字符串的方法(如 slice、replace、toUpperCase)均不会修改原字符串,而是返回一个全新的字符串。
let greeting = "hello";
greeting[0] = "H"; // 尝试通过索引直接修改字符
console.log(greeting); // 仍然是 "hello",赋值操作静默失效(严格模式下报错)
let newGreeting = greeting.toUpperCase();
console.log(newGreeting); // "HELLO"
console.log(greeting); // "hello" 原值未变
7. Symbol:唯一标识符
Symbol 是 ECMAScript 2015(ES6)引入的原语类型。每次调用 Symbol() 函数生成的值都是全全局唯一的,即便传入了完全相同的描述字符串,两个 Symbol 依然互不相等。
典型用途:作为对象属性的私有 Key。这样不仅能彻底避免团队多人协作或第三方库扩展对象时发生命名覆盖冲突,而且 Symbol 属性默认不会出现在 for...in、Object.keys() 等常规迭代遍历中。
const key1 = Symbol("id");
const key2 = Symbol("id");
console.log(key1 === key2); // false
const appConfig = {
appName: "GatewayService",
[key1]: "PRIVATE_TOKEN_9921"
};
console.log(appConfig[key1]); // PRIVATE_TOKEN_9921
console.log(Object.keys(appConfig)); // ["appName"] (Symbol 键名被保护不外泄)
PRIVATE_TOKEN_9921
["appName"]
三、如何准确检测数据类型?
在日常开发与排错中,不同类型有着不同的判断门槛。最常用的 typeof 运算符非常高效,但它存在已知的盲区。判断类型时建议采用如下推导决策路径:
根据上述机制,针对不同的类型检测,规范做法如下:
- 检测 null:直接使用全等比较操作符:
val === null。 - 检测 NaN:使用 ES6 推荐的
Number.isNaN(val),不要使用全局的isNaN()(后者会把"abc"等字符串先转换成数字再判断,造成误判)。 - 检测常规基础类型:直接使用
typeof val。 - 精准通杀方案:使用
Object.prototype.toString.call(val),可以返回诸如[object Null]、[object Undefined]、[object Array]等规范标识符。
四、7种原始类型特性综合速查
为了便于对比与速查,下表将 7 种基本类型的关键特征、常见字面量及对应运算符检测结果汇总如下:
| 类型名 | 引入版本 | 典型声明示例 | typeof 运算结果 | 核心使用场景与特性 |
|---|---|---|---|---|
| Undefined | ES1 | let x; |
"undefined" |
变量初始默认状态、函数未传形参 |
| Null | ES1 | let x = null; |
"object" (已知缺陷) |
空对象指针占位、解除对象引用 |
| Boolean | ES1 | true / false |
"boolean" |
逻辑条件分支控制 |
| Number | ES1 | 100, 3.14, NaN |
"number" |
常规数学运算(64位双精度浮点数) |
| String | ES1 | "text", `val: ${x}` |
"string" |
文本数据,字符值不可变 |
| Symbol | ES6 (2015) | Symbol("token") |
"symbol" |
全局唯一标识,防对象属性名冲突 |
| BigInt | ES11 (2020) | 9007199254740995n |
"bigint" |
超大整数、金融运算、雪花算法 ID |
总结
掌握 JavaScript 的 7 种基本数据类型(Undefined、Null、Boolean、Number、BigInt、String、Symbol),关键在于理清两点:一是内存与赋值机制,原始类型按值传递、内容不可变,与引用对象指向堆地址的行为完全不同;二是类型边界与检测手段,在业务开发中谨记 typeof null 的历史陷阱、IEEE 754 浮点数精度限制,并在需要唯一键名或大整数时,准确选用 ES6 的 Symbol 与 ES2020 的 BigInt。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













