js 数据类型
JavaScript 数据类型分为基础类型(Primitive Types)和引用类型(Reference Types),它们在内存存储、赋值和比较方式上有显著区别。以下是详细分类:
一、基础类型(Primitive Types)
基础类型的值是不可变的,直接存储在栈内存中,且通过值进行比较。
1. 数值(number)
- 表示整数和浮点数,包括特殊值
NaN、Infinity和-Infinity。 - 示例:javascript
let num = 42; let pi = 3.14; let invalid = NaN;
2. 字符串(string)
- 文本数据,用单引号、双引号或反引号定义,支持模板字面量。
- 示例:javascript
let name = "Alice"; let greeting = `Hello, ${name}`; // 模板字符串
3. 布尔值(boolean)
true或false,用于逻辑判断。- 示例:javascript
let isLoggedIn = true;
4. null
- 表示有意设置的空值,类型为
null。 - 示例:javascript
let empty = null;
5. undefined
- 声明未初始化的变量或访问不存在的属性时返回。
- 示例:javascript
let x; // undefined let obj = {}; console.log(obj.foo); // undefined
6. 符号(symbol)
- ES6 引入的唯一标识符,用于对象属性键避免冲突。
- 示例:javascript
const key = Symbol("unique"); const obj = { [key]: "value" };
7. 大整数(bigint)
- ES2020 引入,处理超过
Number安全范围的整数(末尾加n)。 - 示例:javascript
const big = 12345678901234567890n;
二、引用类型(Reference Types)
引用类型的值是可变的,存储在堆内存中,通过引用地址进行比较。
1. 对象(object)
- 键值对集合,包括普通对象、数组、函数等。
- 示例:javascript
const user = { name: "Bob", age: 30 };
2. 数组(array)
- 有序值的集合,动态长度。
- 示例:javascript
const fruits = ["apple", "banana", "orange"];
3. 函数(function)
- 可执行的代码块,属于特殊对象。
- 示例:javascript
function add(a, b) { return a + b; }
4. 日期(Date)
- 处理日期和时间。
- 示例:javascript
const today = new Date();
5. 正则表达式(RegExp)
- 用于模式匹配。
- 示例:javascript
const pattern = /^[A - Za - z]+$/;
三、类型判断方法
| 方法 | 适用场景 |
|---|---|
typeof | 检测基础类型(null 返回 'object')和函数类型。 |
instanceof | 判断对象是否为某构造函数的实例(如 arr instanceof Array)。 |
Array.isArray() | 检测是否为数组。 |
Object.prototype.toString.call() | 精准检测类型(如 [object Array])。 |
四、基础类型与引用类型的区别
| 特性 | 基础类型 | 引用类型 |
|---|---|---|
| 内存存储 | 栈内存 | 堆内存(引用地址存于栈) |
| 可变性 | 不可变 | 可变 |
| 比较方式 | 值比较 | 引用地址比较 |
| 默认赋值行为 | 复制值 | 复制引用地址 |
五、常见面试题
typeof null为什么返回'object'?- 历史遗留问题,
null被错误归类为对象,实际是独立类型。
- 历史遗留问题,
NaN如何检测?- 使用
isNaN()或Number.isNaN()(后者更严格)。
- 使用
null和undefined的区别?null是有意设置的空值,undefined表示未初始化或不存在。
对象属性名可以是哪些类型?
- 字符串、Symbol(ES6+),数字会自动转为字符串。
通过掌握数据类型的特性,可以避免常见错误(如内存泄漏、引用混淆),并写出更健壮的 JavaScript 代码。