# Js 中的数据类型

在 JavaScript 中,数据类型主要可以分为两大类:基本数据类型(Primitive Types)对象类型(Object Types)

# 基本数据类型

  • Number:用于表示数字,包括整数和浮点数。例如:42, 3.14159。

  • String:用于表示文本或字符序列。字符串由单引号(')、双引号(")或反引号()括起来。例如:'Hello', "World", template string ```。

  • Boolean:有两个可能的值,true 或 false,用于表示逻辑状态。

  • Null:有一个特殊的值 null,表示一个空值或“无”值。

  • Undefined:当一个变量被声明了,但没有赋值时,它的值就是 undefined。

  • Symbol:是一种新的数据类型(从 ES6 开始引入),表示一个唯一的、不可变的数据类型,通常用作对象的属性键。

  • BigInt:(从 ES10 开始引入)是一种可以表示任意大整数的数据类型。

# 对象类型

在 JavaScript 中,几乎所有的非基本数据类型都可以归为对象类型。它们包括:

  • Object:通用的对象类型,用于存储多个值作为属性。

  • Array:特殊的对象,用于表示有序的元素集合。例如:[1, 2, 3]。

  • Function:也是对象的一种,用于表示可执行的代码块。

  • Date:用于表示日期和时间。

  • RegExp:用于表示正则表达式,用于字符串的模式匹配。

  • Map 和 Set:ES6 中引入的新数据结构,分别用于存储键值对和无序集合。

  • WeakMap 和 WeakSet:也是 ES6 中引入的,与 Map 和 Set 类似,但它们的键只能是对象,并且不会阻止垃圾回收。

  • TypedArray:如 Int8Array, Uint8Array, Float32Array 等,用于表示特定类型的数组。

  • Promise:用于处理异步操作的对象。

  • 其他自定义对象:由开发者根据需要创建的对象。

# 特殊值

  • Infinity:表示正无穷大。
  • -Infinity:表示负无穷大。
  • NaN:表示非数字(Not a Number),是一个特殊的数值,用于表示某些数学运算的结果未定义或不可表示。 需要注意的是,虽然函数和数组在 JavaScript 中也是对象,但它们具有特殊的属性和方法,因此通常被视为特殊的对象类型。

# 基本数据类型和对象类型的区别

# 基本数据类型

  1. 值存储

    基本数据类型直接存储它们的实际值。这些值存储在栈内存中。

  2. 类型

包括 Number、String、Boolean、Null、Undefined 和 Symbol。

  1. 不可变性

    基本数据类型的值是不可变的。例如,当你尝试改变一个字符串时,实际上是创建了一个新的字符串,而不是改变了原始字符串。

  2. 操作

当你对基本数据类型进行操作时,通常是直接操作它们的值。例如,当你对两个数字进行加法运算时,结果是直接计算得出的。

# 引用数据类型

  1. 值存储

    引用数据类型在栈内存中存储的是对堆内存中实际对象的引用(即地址)。真正的对象值存储在堆内存中。

  2. 类型

    最常见的引用类型是 Object,它包括数组、函数、日期、正则表达式等。

  3. 可变性

    引用数据类型的值是可变的。你可以修改对象的属性或数组的元素,而不会创建新的对象或数组。

  4. 操作

    当你对引用数据类型进行操作时,你实际上是在操作对对象的引用。例如,当你将一个对象赋值给另一个变量时,你实际上是在复制引用,而不是复制对象本身。因此,两个变量现在指向同一个对象。

# 存储差异

  • 栈内存

    基本数据类型的值直接存储在栈内存中,这意味着它们可以直接通过引用访问,速度较快。

  • 堆内存

    引用数据类型的实际对象值存储在堆内存中,栈内存中只保存了对这些对象的引用(地址)。

    当需要访问对象的属性或方法时,JavaScript 引擎会首先查找栈内存中的引用,然后使用该引用在堆内存中找到对应的对象。

    另外,

    由于引用数据类型在堆内存中存储,并且栈内存中只保存引用,因此操作引用数据类型时需要注意避免不必要的复制和引用丢失。

    引用数据类型的比较通常是基于引用的比较,而不是基于值的比较。

    这意味着如果两个变量引用同一个对象,那么它们相等;如果它们引用不同的对象,即使这些对象的内容完全相同,它们也不相等。