技术分享 2025年12月2日 约 23 分钟阅读

JavaScript 基础数据类型详解

JavaScript 是一种弱类型、动态语言。这意味着你不必提前声明变量的类型,类型会在程序运行过程中自动确定。JavaScript 的数据类型分为两大类:基本数据类型(Primitive Types)引用数据类型(Reference Types)

基本数据类型(Primitives)

JavaScript 目前有 7 种基本数据类型。基本数据类型是按值访问的,因为可以操作保存在变量中的实际值。

1. String(字符串)

用于表示文本数据。

let name = "Alice";
let message = 'Hello, World!';
let template = `Hello, ${name}`; // 模板字符串

2. Number(数字)

JavaScript 只有一种数字类型,可以表示整数和浮点数。

let integer = 123;
let float = 3.14;
let infinite = Infinity;
let notANumber = NaN; // Not a Number

3. Boolean(布尔值)

只有两个值:truefalse。常用于条件判断。

let isDone = false;
if (isDone) {
    console.log("Completed");
}

4. Undefined

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

let x;
console.log(x); // undefined

5. Null

null 表示一个“空”值,通常用来表示一个变量将来指向一个对象,但目前为空。

let obj = null;

注意: typeof null 会返回 "object",这是一个历史遗留的 Bug,但 null 确实是基本类型。

6. Symbol(符号)

ES6 引入的新类型,表示独一无二的值。常用于定义对象唯一的属性名。

let sym1 = Symbol("id");
let sym2 = Symbol("id");
console.log(sym1 === sym2); // false

7. BigInt

ES2020 引入,用于表示任意精度的整数。普通的 Number 类型在超过安全范围($2^{53} - 1$)后可能会丢失精度。

const huge = 1234567890123456789012345678901234567890n;

引用数据类型(Objects)

引用类型的值是保存在内存中的对象。JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。

Object(对象)

对象是一组数据和功能的集合。

  • 普通对象: { key: 'value' }
  • 数组 (Array): [1, 2, 3]
  • 函数 (Function): function() {}
  • 日期 (Date): new Date()
  • 正则 (RegExp): /abc/
let person = {
    name: "Bob",
    age: 30
};

let colors = ["Red", "Green", "Blue"];

function greet() {
    console.log("Hi!");
}

基本类型 vs 引用类型

特性基本类型 (Primitive)引用类型 (Reference)
存储位置栈内存 (Stack)堆内存 (Heap)
值访问按值访问按引用访问
复制复制实际的值,互不影响复制引用地址,指向同一对象
比较比较值是否相等比较引用地址是否相同

示例:值的复制

基本类型:

let a = 10;
let b = a;
b = 20;
console.log(a); // 10 (a 不受 b 影响)

引用类型:

let obj1 = { name: "Tom" };
let obj2 = obj1; // 复制的是引用地址
obj2.name = "Jerry";
console.log(obj1.name); // "Jerry" (obj1 受到影响)

类型检测

typeof

用于检测基本数据类型(除了 null)。

typeof "str";   // "string"
typeof 123;     // "number"
typeof true;    // "boolean"
typeof undefined; // "undefined"
typeof Symbol(); // "symbol"
typeof 1n;      // "bigint"
typeof {};      // "object"
typeof [];      // "object"
typeof null;    // "object" (特例)
typeof function(){}; // "function" (特例,但也属于对象)

instanceof

用于检测引用类型,判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置。

[] instanceof Array; // true
{} instanceof Object; // true

总结

理解 JavaScript 的数据类型及其存储方式(栈 vs 堆)是编写健壮代码的基础。特别是在处理对象传递和修改时,要时刻警惕引用类型带来的副作用。