JavaScript 中的值类型和引用类型:你真的懂了吗?
在JavaScript的世界里,数据类型可以分成两大类:原始类型 和引用类型。这两种类型的区别就像是你家里的东西,有些是直接拿来用的"简单物品"(原始类型),有些则是需要通过"说明书"找到的"复杂家具"(引用类型)。搞懂它们的行为,能帮你写出更高效、更少bug的代码。今天我们就来聊聊这两种类型到底是什么,以及它们在实际开发中有什么不一样。
什么是原始类型?
原始类型是JavaScript中最基础的数据类型,它们就像是你口袋里的零钱,直接存着具体的值,简单明了,不能随便改动(专业术语叫"不可变")。JavaScript里一共有七种原始类型,分别是:
- • Number(数字) :比如
5
或者3.14
,用来表示各种数值。 - • String(字符串) :比如
"你好"
或者'world'
,用引号包起来的文本。 - • Boolean(布尔值) :只有
true
(真)和false
(假)两种选择。 - • Null(空值) :表示"故意留空",有点像你刻意清空一个盒子。
- • Undefined(未定义) :表示"还没赋值",就像你买了个新盒子但没放东西。
- • Symbol(符号) :一种独一无二的标识符,常用来给对象加隐藏属性。
- • BigInt(大整数) :用来表示超大数字,比如
9007199254740991n
,比普通数字能存更大值。
举个例子,看看这些原始类型长啥样:
ini
let age = 25; // Number
let name = "小明"; // String
let isStudent = true; // Boolean
let data = null; // Null
let score; // Undefined
let id = Symbol("唯一"); // Symbol
let bigNum = 123456789n; // BigInt
这些类型就像是你家里的独立小物件,用的时候直接拿出来,互不干扰。
什么是引用类型?
引用类型就复杂一些了,它们不像原始类型那样直接存值,而是存一个"地址",通过这个地址找到真正的数据。就像你家里的家具,说明书上写着"仓库地址",你得去仓库取货。JavaScript里常见的引用类型有三种:
- • Object(对象) :键值对的集合,比如
{ name: "小红", age: 18 }
。 - • Array(数组) :有序的列表,比如
[1, 2, 3]
。 - • Function(函数) :可以执行的代码块,比如
function sayHi() { return "嗨!"; }
。
来看看引用类型的例子:
csharp
let person = { name: "小红", age: 18 }; // Object
let numbers = [1, 2, 3, 4]; // Array
function sayHi() { return "嗨!"; } // Function
这些类型就像是你家的大件家具,实际内容存在别的地方,变量里存的只是"提货单"。
原始类型和引用类型有啥不一样?
它们的区别主要体现在"赋值"和"传参"时的行为上,简单来说,一个是"独立副本",一个是"共享地址"。
1. 赋值时的表现
- • 原始类型:赋值时会复制一份新值,每个变量都独立拥有自己的数据,互不影响。就像你把一块糖给了朋友,你俩手里的糖是两块,改你的不影响他。
ini
let a = 10;
let b = a; // b复制了a的值
b = 20; // 改b不会影响a
console.log(a); // 输出:10
console.log(b); // 输出:20
- • 引用类型:赋值时只复制"地址",两个变量指向同一个对象。改一个,另一个也会变。就像你把家具提货单给了朋友,你俩改的是同一件家具。
ini
let obj1 = { name: "小明" };
let obj2 = obj1; // obj2复制了obj1的地址
obj2.name = "小红"; // 通过obj2改了对象
console.log(obj1.name); // 输出:"小红"
console.log(obj2.name); // 输出:"小红"
2. 函数传参时的表现
- • 原始类型:传给函数时,函数拿到的是值的副本,改了也不影响外面。就像你把糖的照片给朋友,他涂鸦照片不会弄脏你的糖。
ini
function changeNum(num) {
num = 100;
}
let myNum = 50;
changeNum(myNum);
console.log(myNum); // 输出:50(没变)
- • 引用类型:传给函数时,函数拿到的是地址,改了会影响原对象。就像你把提货单给朋友,他在仓库里改了家具,你去取时发现变样了。
ini
function changeName(person) {
person.name = "小刚";
}
let myPerson = { name: "小丽" };
changeName(myPerson);
console.log(myPerson.name); // 输出:"小刚"(变了)
为什么这很重要?
搞懂原始类型和引用类型的区别,对写好代码有三大好处:
-
- 避免奇怪的bug
如果你不小心改了一个引用类型的对象,可能会影响到代码的其他地方。比如你以为只改了一个数组,结果发现整个程序的数据都乱了。明白这点,就能小心处理,避免踩坑。
- 避免奇怪的bug
-
- 节省内存
原始类型直接存值,小而简单;引用类型存地址,能高效处理复杂数据。比如一个大数组不用复制多份,只用一个地址到处传,省内存又快。
- 节省内存
-
- 代码更清晰
知道数据怎么传、怎么改,就能写出行为可预测的代码。别人读你的代码时,也能一眼看懂逻辑,维护起来更轻松。
- 代码更清晰
小结:从理论到实践
原始类型和引用类型是JavaScript的基石。原始类型简单直接,像独立的小零件;引用类型灵活强大,像需要组装的大玩具。赋值和传参时,原始类型复制值,引用类型共享地址,记清这点能帮你少走弯路。
想更深入学习JavaScript的实用技巧?可以看看一些免费课程或者实战项目,动手试试这些概念,效果会更好哦!有什么问题,欢迎留言交流~