You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用const声明的useState状态变量仍能被修改?

为什么React中const [counter, setCounter] = useState()的counter能通过setCounter更新?

首先得明确两个核心点:const的本质,以及React组件的渲染逻辑。

1. const的限制是「不能重新赋值」,不是「值不能变」

const声明的变量,核心规则是不允许直接重新赋值,比如下面的代码会直接报错:

const num = 0;
num = 1; // 报错:Assignment to constant variable.

但如果是引用类型(比如对象、数组),const只是锁定变量的引用,内部属性依然可以修改:

const obj = { count: 0 };
obj.count = 1; // 完全合法,因为没有重新给obj赋值

不过回到useState的场景,哪怕counter是基本类型(数字、字符串),你也没在修改原来的counter——你只是让React创建了一个新的counter。

2. setCounter没有修改原变量,而是触发了组件重新渲染

当你调用setCounter时,React会做两件事:

  • 更新它内部维护的状态值
  • 触发组件的重新渲染

组件重新渲染时,整个组件函数会被重新执行一遍。这时候const [counter, setCounter] = useState()会从React的状态管理中取出更新后的值,生成一个全新的const变量counter。

举个直观的例子:
第一次渲染组件时,函数执行,useState(0)返回[0, setCounter],此时的counter是值为0的常量;
点击按钮调用setCounter(1)后,React重新执行组件函数,useState这次返回[1, setCounter],此时的counter是值为1的新常量。

这两个counter是完全独立的变量,只是名字相同,它们分别存在两次函数执行的不同作用域里。原来的counter(值为0的那个)并没有被修改,只是不再被使用了——因为组件已经重新渲染,现在用的是新的counter。

总结一下:你觉得counter被修改了,其实是组件重新渲染后生成了同名的新常量,而非修改了原来的const变量。

内容的提问来源于stack exchange,提问作者Sbaliyev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:00:57