1. 原始类型(Primitive Types)
这些类型的数据直接存储在变量中,占用较小的内存空间,并且是不可变的。
- Number: 表示数值类型,可以是整数或浮点数。例如:
42
,3.14
。特殊的数值类型包括NaN
(非数字)和Infinity
。 - String: 表示文本数据的类型,由零个或多个 16 位的字符组成。例如:
"hello"
,'world'
。 - Boolean: 表示布尔值类型,只能取
true
或false
。例如:true
,false
。 - Undefined: 表示一个未定义的值。默认情况下,声明但未赋值的变量会自动赋值为
undefined
。 - Null: 表示一个空值或无效值。通常用于指示变量未指向任何对象。
- Symbol: 表示唯一的、不可变的标识符,用于对象属性的键值。每个
Symbol
值都是唯一的。 - BigInt: 表示任意精度的整数,可以表示非常大的整数,超过了
Number
的范围。通过在数字后加n
创建。例如:12345678901234567890n
。
2. 引用类型(Reference Types)
这些类型的数据是通过引用来访问的,存储在堆内存中,变量保存的是内存地址的引用。
- Object: 所有对象类型都属于引用类型。对象是键值对的集合,可以包含任意数量的属性。例如:
{name: "John", age: 30}
。 - Array: 表示有序的元素集合,元素可以是任意类型。例如:
[1, 2, 3]
,["a", "b", "c"]
。 - Function: 一种特殊类型的对象,用于封装可执行的代码块。例如:
function greet() { console.log("Hello"); }
。 - Date: 表示日期和时间。通过
new Date()
创建日期对象。例如:new Date("2024-08-20")
。 - RegExp: 表示正则表达式,用于匹配字符串中的模式。例如:
/abc/i
。 - Map: 一种键值对集合,键可以是任意类型,类似于对象,但有序且键不受限于字符串或 Symbol 类型。
- Set: 一种值的集合,值都是唯一的,不重复。
- WeakMap: 类似于
Map
,但键必须是对象,且对键的引用是弱引用,不阻止垃圾回收。 - WeakSet: 类似于
Set
,但只能包含对象,且对对象的引用是弱引用。
区别
- 存储方式:原始类型直接存储在栈内存中,而引用类型存储在堆内存中,变量保存的是引用地址。
- 可变性:原始类型是不可变的,改变值时是创建新值;引用类型是可变的,可以直接修改其内部结构。
- 赋值行为:原始类型在赋值时复制值,引用类型在赋值时复制引用地址,因此改变引用类型的副本会影响原始对象。
- 比较:原始类型使用值比较,引用类型使用引用地址比较。
- 性能:由于原始类型占用的内存较小,通常存储在栈中,因此访问速度更快;引用类型由于存储在堆中,访问相对较慢。