JavaScript有哪些数据类型:8种基本与引用类型清单
详细梳理JavaScript最新的8种数据类型:7种基本原始类型(Number、String、Boolean、Undefined、Null、Symbol、BigInt)与1种引用类型(Object)。包含底层内存分配、行为差异、类型判断决策流及实用避坑指南。
一、两大类别与内存模型总览
JavaScript 是动态弱类型语言,变量本身没有固定的类型限制,真正拥有类型的是变量当前所持有的值。为了管理运行期的数据,JavaScript 引擎将这 8 种类型按内存存储方式划分在两种不同的空间中:
- 基本数据类型(7种):
Number、String、Boolean、Undefined、Null、Symbol、BigInt。它们的值占用固定大小的内存,直接存储在栈内存(Stack)中,属于按值访问。 - 引用数据类型(1种):
Object(包括普通对象、Array、Function、Date、RegExp、Map、Set 等)。对象结构大小不固定,实体内容存储在堆内存(Heap)中,栈内存中仅保存一个指向堆内存实体的地址指针,属于按引用访问。
二、7种基本数据类型(原始类型)详述
基本数据类型的值保存在栈内存中,本身具有不可变性(Immutability)。一旦创建,其值本身无法在原内存地址被修改,任何针对基本类型的算术或字符串拼接操作都会产生一个全新的值。
1. Number(数值)
JavaScript 不区分整型和浮点型,所有的常规数字均采用 IEEE 754 标准的双精度 64 位浮点数格式存储。这种存储方式决定了 Number 能够安全表示的整数范围在 -(2^53 - 1) 到 2^53 - 1 之间。
Number 类型还包含三个特殊的数值:
Infinity:正无穷大,例如非零数值除以0得到的结果。-Infinity:负无穷大。NaN(Not-a-Number):表示非合法数字运算结果(如0 / 0或Number('abc'))。需要特别注意,NaN !== NaN返回true,必须使用Number.isNaN()进行可靠判断。
let score = 95;
let price = 19.99;
let overflow = 1 / 0; // Infinity
let invalid = Number("text"); // NaN
console.log(Number.isNaN(invalid)); // true
2. String(字符串)
String 用于表示文本数据,是由 16 位 Unicode 字符组成的不可变有序序列。支持单引号 ''、双引号 "" 以及 ES6 引入的反引号 ``(模板字符串)。
let single = 'hello';
let double = "world";
let template = `${single} ${double}!`; // 支持表达式插值
需要注意字符串的不可变性:调用 str.toUpperCase() 或 str.slice() 不会改变原字符串,而是返回一个全新的字符串。
3. Boolean(布尔值)
Boolean 仅有两个字面量值:true 和 false。它通常用于条件分支判断。在 JavaScript 的隐式类型转换中,以下 8 个值会被视为“假值”(Falsy),其余所有值均转换为 true:
false0、-0、0n(BigInt 零)""(空字符串)nullundefinedNaN
4. Undefined(未定义)
Undefined 类型仅有一个值,即 undefined。它表示变量已经通过 let、var 或 const 声明,但尚未被赋予具体的值。此外,访问对象不存在的属性、未传参的函数形参,或者没有书写 return 语句的函数执行返回值,均为 undefined。
let username;
console.log(username); // 输出: undefined
function test() {}
console.log(test()); // 输出: undefined
5. Null(空值)
Null 类型也仅有一个值,即 null。它在语义上表示“故意设置为空的对象引用”。通常用作变量初始化的占位符,或者用于解除对象的引用以便垃圾回收。
执行 typeof null 会返回 "object"。这是 JavaScript 最初版本为了性能用低位标签表示类型的历史设计遗留缺陷,并不代表 null 属于引用类型,null 在规范定义中是确凿的基本数据类型。
6. Symbol(符号 · ES6新增)
Symbol 是 ES6 引入的原语,通过 Symbol() 函数生成。每次调用 Symbol() 都会返回一个全局独一无二的值,即使传入相同的描述字符串也绝不相等。常用于为对象定义私有或唯一的属性名,防止属性在不同模块之间被意外覆盖。
const id1 = Symbol("id");
const id2 = Symbol("id");
console.log(id1 === id2); // false
const user = {
[id1]: "10086",
name: "张三"
};
console.log(user[id1]); // "10086"
7. BigInt(大整数 · ES2020新增)
BigInt 解决了 Number 类型超过安全整数范围(Number.MAX_SAFE_INTEGER 即 9007199254740991)后出现的精度丢失问题。可以通过在一个整数末尾加上小写字母 n,或者调用 BigInt() 构造。
const maxSafe = 9007199254740991;
console.log(maxSafe + 1 === maxSafe + 2); // true (Number 溢出导致精度丢失)
const big1 = 9007199254740991n;
console.log(big1 + 1n === big1 + 2n); // false (BigInt 精确运算)
注意:BigInt 与普通 Number 不能直接进行算术混合运算(例如 10n + 5 会抛出 TypeError),必须显式转换后才能计算。
三、1种引用数据类型(Object 及其衍生形态)
在 JavaScript 中,除上述 7 种基本类型外,其余所有复合实体都统称为 Object(对象)。Object 是一组键值对的集合,其键可以是 String 或 Symbol,值可以是任意数据类型。
以下常见的结构在底层规范上都是 Object 的子集或特化实现:
- Array(数组):以整数为索引、有序存储数据的对象,具备
length属性和内置数组操作方法。 - Function(函数):拥有可执行代码块的特殊对象,能够作为一等公民在变量间传递。
- Date、RegExp、Error:用于处理时间、正则表达式与异常的内置专有对象。
- Map、Set、WeakMap、WeakSet:ES6 引入的集合型数据结构。
四、基本类型与引用类型的核心行为差异
基本类型与引用类型在赋值、传参和属性读写时表现出截然不同的行为模式:
- 按值传递与独立性:基本类型的复制是完整生成一个新副本,修改新变量绝不影响旧变量。
- 按引用传递与共享性:引用类型的复制仅仅复制了指向堆内存实体的地址指针。因此通过一个变量修改对象属性,所有持有同一引用的变量都会感知到该变化。
- 全等比较规则:两个基本类型比较(
===)时比较的是具体数值是否相等;而两个对象比较时,即使内容完全相同(如{} === {}),只要所指向的堆内存地址不同,结果依然是false。
五、精准检测 8 种数据类型的决策方案
在开发过程中,准确判断变量类型是常见任务。由于历史兼容性原因,单一工具无法胜任所有场景,需要根据不同类型采用针对性的判断手段:
1. typeof 运算符
typeof 是最快捷的原生运算符,能够安全检测大部分基本数据类型以及函数。其返回值均为全小写的字符串:
typeof 42; // "number"
typeof "abc"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof Symbol(); // "symbol"
typeof 100n; // "bigint"
typeof function(){};// "function" (函数特殊返回)
// 局限性:无法区分 null、数组及普通对象
typeof null; // "object" (历史设计缺陷)
typeof []; // "object"
typeof {}; // "object"
2. Array.isArray()
由于 typeof [] 返回 "object",不能直接识别数组。ES5 提供了专门的 Array.isArray() 方法,即使在多 iframe 嵌套的不同窗口执行环境中也能百分之百准确识别数组。
Array.isArray([]); // true
Array.isArray({ length: 0 }); // false (类数组不是真数组)
3. Object.prototype.toString.call()(万能终极方案)
如果需要无视环境与类型差异,获取完全确定的类型名称,推荐调用 Object.prototype.toString.call(target)。该方法会借用 Object 顶层原型方法,返回格式为 [object Type] 的字符串:
const getType = (target) => {
return Object.prototype.toString.call(target).slice(8, -1).toLowerCase();
};
console.log(getType(123)); // "number"
console.log(getType(null)); // "null"
console.log(getType(undefined)); // "undefined"
console.log(getType([])); // "array"
console.log(getType({})); // "object"
console.log(getType(new Date())); // "date"
console.log(getType(/abc/)); // "regexp"
console.log(getType(new Map())); // "map"
六、8种数据类型特征速查总结
最后,将 JavaScript 完整的 8 种数据类型及其核心特性、检测手段归纳为全景速览清单:
| 类型名称 | 所属分类 | 典型字面量 / 构造示例 | typeof 返回值 | 推荐检测方式 |
|---|---|---|---|---|
| Number | 基本数据类型 | 42, 3.14, NaN |
"number" |
typeof x === 'number' |
| String | 基本数据类型 | "hello", `hi ${name}` |
"string" |
typeof x === 'string' |
| Boolean | 基本数据类型 | true, false |
"boolean" |
typeof x === 'boolean' |
| Undefined | 基本数据类型 | undefined |
"undefined" |
typeof x === 'undefined' |
| Null | 基本数据类型 | null |
"object" (历史Bug) |
x === null |
| Symbol | 基本数据类型 | Symbol("desc") |
"symbol" |
typeof x === 'symbol' |
| BigInt | 基本数据类型 | 9007199254740992n |
"bigint" |
typeof x === 'bigint' |
| Object | 引用数据类型 | {}, [], () => {} |
"object" / "function" |
Object.prototype.toString.call() |
掌握这 8 种数据类型的划分标准与内存行为,不仅有助于在日常开发中写出类型安全的代码,更能从容应对深浅拷贝、原型链继承及复杂数据结构的比较操作。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19








