说说 JS 中的数据类型与存储差别

1. 所有数据类型

JS 中数据类型分为两类:

  • 基本类型(值类型、原始类型):Number、String、Boolean、Undefined、Null、Symbol、BigInt。
  • 引用类型(对象类型):Object(含普通对象、数组、函数、Date、RegExp、Map、Set 等)。

2. 基本类型说明

  • Number:最常见的整数格式为十进制,也可以八进制(0 开头)、十六进制(0x 开头)。特殊值 NaN 表示"不是数值",用于表示本应返回数值但失败的操作。
  • String:可用双引号、单引号或反引号表示。字符串是不可变的,一旦创建,其值就不能改变。
  • Boolean:只有 true / false 两个值。Boolean(x) 可将其他类型转为布尔值,规则如下:
| 数据类型    | 转为 true 的值          | 转为 false 的值   |
| ----------- | ----------------------- | ----------------- |
| String      | 非空字符串              | ""                |
| Number      | 非零数值(含无穷值)    | 0、NaN            |
| Object      | 任意对象                | null              |
| Undefined   | N/A                     | undefined         |
  • Undefined:只有一个值 undefined。var / let 声明但未初始化时,变量值就是 undefined(已声明的 undefined 与未声明的变量不同)。

  • Null:只有一个值 null,逻辑上表示空对象指针,这也是 typeof null 返回 "object" 的原因。undefined === null 为 false,但 null == undefined 为 true(因为 undefined 派生自 null)。当变量要保存对象、但当时还没有对象时,可以用 null 填充。

  • Symbol:原始值,符号实例唯一、不可变,用于确保对象属性使用唯一标识符、避免属性冲突。

3. 引用类型

复杂类型统称为 Object,主要的三类:

  • 狭义对象:{...},属性集合。
  • 数组:有序集合。
  • 函数:可调用对象。

其他引用类型还有 Date、RegExp、Map、Set、WeakMap、WeakSet、ArrayBuffer 等。

4. 存储上的差别

基本类型和引用类型在内存中的存储方式不同:

  • 基本类型:占用空间小、大小固定,存储在栈内存中。按值访问。
  • 引用类型:占用空间大、大小不固定,存储在堆内存中;栈中只保存指向堆内存地址的指针(引用)。按引用访问,多个变量可能指向同一个对象。
let a = 1;       // 栈
let b = a;       // 复制值,b 改变不影响 a
b = 2;
console.log(a);  // 1

let o1 = { x: 1 }; // 栈中存地址,指向堆中的对象
let o2 = o1;       // 复制的是指针
o2.x = 2;
console.log(o1.x); // 2 (共享同一个堆对象)

小结

  • 基本类型按值存取、不可变;
  • 引用类型按引用存取、可变;
  • 函数参数传递:都是按值传递(把变量里的值 / 引用复制一份传进去)。

来源整理自:vue3js.cn 面试官系列