JavaScript 数据类型可以分为两大类:原始数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。截至2025年,根据你提供的信息,JavaScript 共有八种数据类型:
原始数据类型(Primitive Data Types)
- Undefined - 表示未定义的值。当一个变量声明了但没有赋值时,默认值为
undefined。 - Null - 表示空值或不存在的对象。尽管看起来与
undefined类似,但在语义上表示有意设置为空值。 - Boolean - 逻辑类型的值,只有两个值:
true和false,用于逻辑运算和条件判断。 - Number - 数字类型,包括整数和浮点数。有一个特殊的
NaN(Not-a-Number)值,表示非数字的结果。 - String - 字符串类型,用于表示文本数据。字符串可以用单引号、双引号或反引号(模板字符串)表示。
- Symbol (ES6 新增) - 表示独一无二的值,主要用于对象属性的键名,以避免冲突。
- BigInt (ES6 新增) - 支持任意长度的整数,通过在整数末尾添加
n或者使用BigInt()构造函数创建。
引用数据类型(Reference Data Types)
- Object - 包括普通对象
{}、数组[]、函数等复杂数据结构。引用数据类型存储的是内存地址,指向实际存放数据的堆内存区域。
存储方式的区别
-
原始数据类型:直接存储在栈(stack)中,占据空间小且大小固定。操作这些数据时,是按值访问,即每个变量都保存着独立的数据副本。
-
引用数据类型:存储在堆(heap)中,因为它们通常较大且大小不固定。栈中仅存储指向堆内存中的对象地址(指针),因此多个变量可能指向同一个堆内存地址。这意味着,对于引用数据类型的操作是按引用访问,改变一个变量的值可能会影响到所有引用该对象的地方。
关于堆和栈
在计算机科学中,“堆”和“栈”不仅存在于 JavaScript 中,在操作系统层面也有对应的概念:
- 栈(Stack):具有后进先出(LIFO, Last In First Out)的特点,由编译器自动管理,适用于局部变量和函数调用。
- 堆(Heap):是一种无序的、动态分配的内存池,程序员需要手动管理(虽然现代语言如 JavaScript 通过垃圾回收机制自动化这一过程),适合存储大小不固定的对象。
理解这些区别有助于编写更高效、可维护的代码,并能更好地解决诸如变量作用域、内存管理和性能优化等问题。