在 JavaScript(包括 Node.js 环境)中,数据类型和数据结构是构建程序的基础。以下是 Node.js 中常用的数据类型和数据结构的详细说明:
一、基本数据类型(Primitive Types)
Number
表示整数或浮点数(64 位双精度浮点型),例如:42、3.14、-100。
特殊值:Infinity(无穷大)、-Infinity(负无穷)、NaN(非数字,如 0/0)。
String
表示文本数据,由 Unicode 字符组成,可用单引号、双引号或反引号包裹,例如:'hello'、"world"、Node.js。
不可变:字符串一旦创建,其内容无法修改(修改会生成新字符串)。
Boolean
表示逻辑值,仅有两个可能:true(真)或 false(假)。
Null
表示 “空值”,主动定义一个空对象或空引用,例如:let a = null(类型为 object,历史遗留问题)。
Undefined
表示 “未定义”,变量声明后未赋值时的默认值,例如:let b; console.log(b); // undefined。
Symbol(ES6 新增)
表示唯一的、不可变的标识符,常用于对象属性的唯一键,例如:const s = Symbol('id');。
BigInt(ES2020 新增)
表示任意精度的整数,用于超过 Number 最大安全值(2^53 - 1)的场景,结尾加 n,例如:9007199254740993n。
二、引用数据类型(Reference Types)
引用类型存储的是值的引用(内存地址),变量指向的是对象在内存中的位置,而非值本身。Node.js 中主要包括:
Object
最基础的引用类型,用于存储键值对集合,键可以是字符串或 Symbol,值可以是任意类型。
const obj = {
name: 'Node.js',
version: '18.x',
isStable: true
};
Array
有序的元素集合,长度动态可变,元素可以是任意类型(包括混合类型)。
const arr = [1, 'hello', true, { key: 'value' }];
Function
可执行的代码块,也是一种特殊的对象,可作为参数传递或作为返回值
function add(a, b) { return a + b; }
const multiply = (a, b) => a * b;
Date
用于处理日期和时间,基于时间戳(自 1970-01-01 00:00:00 UTC 起的毫秒数)。
const now = new Date();
console.log(now.toLocaleString()); // 本地时间字符串
RegExp
正则表达式,用于匹配字符串模式,由模式和修饰符组成。
const pattern = /hello/i; // 不区分大小写匹配 "hello"
console.log(pattern.test('Hello')); // true
Map(ES6 新增)
键值对集合,键可以是任意类型(包括对象),且能保持插入顺序,比普通对象更适合频繁增删键的场景。
const map = new Map();
map.set('name', 'Node.js');
map.set(123, 'number key');
console.log(map.get('name')); // "Node.js"
Set(ES6 新增)
唯一值的集合(无重复元素),值可以是任意类型,常用于去重或判断元素是否存在。
const set = new Set([1, 2, 2, 3]);
console.log([...set]); // [1, 2, 3](自动去重)
Buffer(Node.js 特有)
用于处理二进制数据(如文件、网络流),是 Node.js 对 Uint8Array 的扩展,长度固定
const buf = Buffer.from('hello', 'utf8');
console.log(buf.toString('base64')); // 二进制转Base64
其他特殊对象
Error:表示错误信息,包括 SyntaxError、TypeError 等子类。
Promise:用于异步操作的结果处理(ES6 新增)。
WeakMap/WeakSet:弱引用集合,键 / 值为对象时不阻止垃圾回收,适合临时缓存。
数据类型检测方法
typeof:适合检测基本类型(除 null 外)和 function。
typeof 42; // "number"
typeof 'hello'; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof Symbol(); // "symbol"
typeof 123n; // "bigint"
typeof function(){}; // "function"
typeof null; // "object"
typeof {}; // "object"(注意:null 会返回 "object")
instanceof:适合检测引用类型(基于原型链)
[] instanceof Array; // true
new Date() instanceof Date; // true
Object.prototype.toString.call():最准确的通用检测方法。
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(new Map()); // "[object Map]"
数据结构
数据结构是计算机中组织和存储数据的方式,不同的数据结构适用于不同的场景,影响着程序的效率。常见的数据结构可分为线性结构、树形结构、图形结构和其他结构四大类
线性结构(元素间为一对一关系)
数组(Array)
特点:连续存储元素,通过索引(下标)快速访问,长度固定(静态数组)或动态可变(动态数组)。
优势:随机访问速度快(时间复杂度 O (1))。
劣势:插入 / 删除中间元素效率低(需移动其他元素,O (n))。
应用:存储有序数据,如列表、矩阵等。
链表(Linked List)
特点:元素(节点)通过指针 / 引用连接,不要求连续存储,分为单链表、双链表、循环链表。
优势:插入 / 删除元素效率高(只需修改指针,O (1)),长度动态扩展。
劣势:随机访问效率低(需从头遍历,O (n))。
应用:实现队列、栈、哈希表冲突解决等。
栈(Stack)
特点:遵循 “后进先出”(LIFO)原则,仅允许在栈顶插入(push)和删除(pop)。
实现:可用数组或链表实现。
应用:函数调用栈、表达式求值、括号匹配等。
队列(Queue)
特点:遵循 “先进先出”(FIFO)原则,允许在队尾插入(enqueue)、队头删除(dequeue)。
变种:双端队列(Deque,两端均可操作)、优先队列(按优先级出队)。
应用:任务调度、BFS(广度优先搜索)、缓冲处理等。
字符串(String)
特点:由字符组成的有序序列,可视为特殊的数组(元素为字符)。
特性:不可变(如 JavaScript 字符串)或可变(如 C++ 的 string)。
应用:文本处理、模式匹配等。
树形结构(元素间为一对多关系)
二叉树(Binary Tree)
特点:每个节点最多有两个子节点(左子树、右子树)。
特殊类型:
满二叉树:所有叶子节点在同一层,非叶子节点均有两个子节点。
完全二叉树:除最后一层外,其他层节点数满,最后一层左对齐。
应用:二叉搜索树、堆、哈夫曼树等的基础。
二叉搜索树(Binary Search Tree, BST)
特点:左子树所有节点值 <根节点值,右子树所有节点值> 根节点值(左小右大)。
优势:查找、插入、删除效率高(平衡时 O (log n))。
问题:可能退化为链表(如有序插入时),效率降至 O (n)。
平衡二叉树(AVL Tree)
特点:左右子树高度差不超过 1,通过旋转(左旋、右旋)保持平衡。
优势:解决 BST 失衡问题,确保操作效率稳定在 O (log n)。
红黑树(Red-Black Tree)
特点:通过颜色(红 / 黑)和规则保证 “黑平衡”(最长路径不超过最短路径 2 倍),旋转操作更少。
应用:C++ map、Java TreeMap 等集合的底层实现。
堆(Heap)
特点:完全二叉树结构,分为大顶堆(父节点 ≥ 子节点)和小顶堆(父节点 ≤ 子节点)。
应用:优先队列、堆排序、Top K 问题等。
字典树(Trie)
特点:多叉树,用于存储字符串,共享前缀以节省空间。
应用:前缀匹配、自动补全、拼写检查等。
线段树(Segment Tree)
特点:用于区间查询和更新(如区间求和、最大值),每个节点代表一个区间。
优势:区间操作效率高(O (log n))。
图形结构(元素间为多对多关系)
图(Graph)
特点:由顶点(Vertex)和边(Edge)组成,边可带权值,分为有向图(边有方向)和无向图(边无方向)。
表示方法:邻接矩阵(二维数组)、邻接表(链表 / 数组 + 链表)。
遍历算法:DFS(深度优先搜索)、BFS(广度优先搜索)。
应用:社交网络、路径规划(如最短路径 Dijkstra 算法)、网络拓扑等。
其他结构
哈希表(Hash Table)
特点:通过哈希函数将键(Key)映射到存储地址,实现快速查找(理想 O (1))。
冲突解决:开放寻址法(如线性探测)、链地址法(链表存储冲突元素)。
应用:字典、缓存、数据库索引等(如 JavaScript 对象、Python 字典)。
集合(Set)
特点:存储唯一元素,无重复值,支持添加、删除、查找操作。
实现:基于哈希表或二叉搜索树。
应用:去重、交集 / 并集 / 差集计算。
堆(Heap)
(见树形结构中的堆,常单独归类为抽象数据类型)
布隆过滤器(Bloom Filter)
特点:空间高效的概率型数据结构,用于判断元素 “可能存在” 或 “一定不存在”。
优势:插入和查询快(O (k),k 为哈希函数个数),内存占用小。
劣势:有假阳性(误判存在),不支持删除。
应用:缓存穿透防护、海量数据去重等。