JavaScript 中的值类型和引用类型:你真的懂了吗?

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);  // 输出:"小刚"(变了)

为什么这很重要?

搞懂原始类型和引用类型的区别,对写好代码有三大好处:

    1. 避免奇怪的bug
      如果你不小心改了一个引用类型的对象,可能会影响到代码的其他地方。比如你以为只改了一个数组,结果发现整个程序的数据都乱了。明白这点,就能小心处理,避免踩坑。
    1. 节省内存
      原始类型直接存值,小而简单;引用类型存地址,能高效处理复杂数据。比如一个大数组不用复制多份,只用一个地址到处传,省内存又快。
    1. 代码更清晰
      知道数据怎么传、怎么改,就能写出行为可预测的代码。别人读你的代码时,也能一眼看懂逻辑,维护起来更轻松。

小结:从理论到实践

原始类型和引用类型是JavaScript的基石。原始类型简单直接,像独立的小零件;引用类型灵活强大,像需要组装的大玩具。赋值和传参时,原始类型复制值,引用类型共享地址,记清这点能帮你少走弯路。

想更深入学习JavaScript的实用技巧?可以看看一些免费课程或者实战项目,动手试试这些概念,效果会更好哦!有什么问题,欢迎留言交流~

相关推荐
weixin_382395232 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__2 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.3 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~4 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华5 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子7 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅7 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni7 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学9 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端