说说 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 面试官系列



