# 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 中也是对象,但它们具有特殊的属性和方法,因此通常被视为特殊的对象类型。
# 基本数据类型和对象类型的区别
# 基本数据类型
值存储
基本数据类型直接存储它们的实际值。这些值存储在栈内存中。
类型
包括 Number、String、Boolean、Null、Undefined 和 Symbol。
不可变性
基本数据类型的值是不可变的。例如,当你尝试改变一个字符串时,实际上是创建了一个新的字符串,而不是改变了原始字符串。
操作
当你对基本数据类型进行操作时,通常是直接操作它们的值。例如,当你对两个数字进行加法运算时,结果是直接计算得出的。
# 引用数据类型
值存储
引用数据类型在栈内存中存储的是对堆内存中实际对象的引用(即地址)。真正的对象值存储在堆内存中。
类型
最常见的引用类型是 Object,它包括数组、函数、日期、正则表达式等。
可变性
引用数据类型的值是可变的。你可以修改对象的属性或数组的元素,而不会创建新的对象或数组。
操作
当你对引用数据类型进行操作时,你实际上是在操作对对象的引用。例如,当你将一个对象赋值给另一个变量时,你实际上是在复制引用,而不是复制对象本身。因此,两个变量现在指向同一个对象。
# 存储差异
栈内存
基本数据类型的值直接存储在栈内存中,这意味着它们可以直接通过引用访问,速度较快。
堆内存
引用数据类型的实际对象值存储在堆内存中,栈内存中只保存了对这些对象的引用(地址)。
当需要访问对象的属性或方法时,JavaScript 引擎会首先查找栈内存中的引用,然后使用该引用在堆内存中找到对应的对象。
另外,
由于引用数据类型在堆内存中存储,并且栈内存中只保存引用,因此操作引用数据类型时需要注意避免不必要的复制和引用丢失。
引用数据类型的比较通常是基于引用的比较,而不是基于值的比较。
这意味着如果两个变量引用同一个对象,那么它们相等;如果它们引用不同的对象,即使这些对象的内容完全相同,它们也不相等。
← 框架原理 js 中的堆和栈有什么区别? →