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的实用技巧?可以看看一些免费课程或者实战项目,动手试试这些概念,效果会更好哦!有什么问题,欢迎留言交流~

相关推荐
痴心阿文5 分钟前
新版 React19使用 react-quill
前端·npm·node.js
乔冠宇7 分钟前
React基础语法速览
javascript·react.js·ecmascript
月亮慢慢圆32 分钟前
事件循环
前端
huangkaihao33 分钟前
像讲故事一样的STAR法则:从像素到视口的自适应之旅
前端·面试·程序员
Ryanho33 分钟前
使用bun搭建一个vitepress个人笔记站点
前端
oil欧哟36 分钟前
🧐什么是 MCP 服务?如何利用 cursor + MCP 快速将现有服务接入大模型?
前端·node.js·cursor
前端小崔37 分钟前
从零开始学习three.js(12):单个大模型加载优化实战:从卡顿到流畅的完整指南
前端·three.js
mikan38 分钟前
练习手写一个光线追踪渲染器
前端
逆袭的小黄鸭38 分钟前
仿 ElementPlus 组件库(七)—— 使用 VitePress 生成文档页
前端·vue.js
进击的莫莫哒38 分钟前
Promise使用快速攻略
前端·javascript