Skip to content

1. 原始类型(Primitive Types)

这些类型的数据直接存储在变量中,占用较小的内存空间,并且是不可变的。

  • Number: 表示数值类型,可以是整数或浮点数。例如:42, 3.14。特殊的数值类型包括 NaN(非数字)和 Infinity
  • String: 表示文本数据的类型,由零个或多个 16 位的字符组成。例如:"hello", 'world'
  • Boolean: 表示布尔值类型,只能取 truefalse。例如: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,但只能包含对象,且对对象的引用是弱引用。

区别

  • 存储方式:原始类型直接存储在栈内存中,而引用类型存储在堆内存中,变量保存的是引用地址。
  • 可变性:原始类型是不可变的,改变值时是创建新值;引用类型是可变的,可以直接修改其内部结构。
  • 赋值行为:原始类型在赋值时复制值,引用类型在赋值时复制引用地址,因此改变引用类型的副本会影响原始对象。
  • 比较:原始类型使用值比较,引用类型使用引用地址比较。
  • 性能:由于原始类型占用的内存较小,通常存储在栈中,因此访问速度更快;引用类型由于存储在堆中,访问相对较慢。