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(布尔值)
只有两个值:true 和 false。常用于条件判断。
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 堆)是编写健壮代码的基础。特别是在处理对象传递和修改时,要时刻警惕引用类型带来的副作用。