javascript 使用常量声明对象的Wierd行为[重复]

drnojrws  于 2023-03-16  发布在  Java
关注(0)|答案(3)|浏览(122)

此问题在此处已有答案

Why can I change a constant object in javascript(12个答案)
两年前关闭了。
我一直在做letconst的一些练习,发现const沿着对象赋值有一些有趣的地方。
根据定义:在JavaScript中,const表示标识符不能被重新分配。

const numConst = 20;
numConst = 40;
console.log("numConst", numConst);
Uncaught TypeError: Assignment to constant variable.

然而当我试图修改用const声明的对象时,它是允许的:

const person = { name: "test", age: 20 };
person.age = 40;
console.log("person.age", person.age); // outputs: person.age 40

为什么const与object的行为不同?

sg3maiej

sg3maiej1#

https://www.w3schools.com/JS/js_const.asp
关键字const有点误导。
它不定义常量值。它定义了对值的常量引用。
正因为如此,我们不能改变常量基元值,但是我们可以改变常量对象的属性。
const a = {foo: 'bar'};定义一个新对象(因此是一个新引用).这个引用将被存储在a中.
当稍后调用a = {bar: 'foo'}时,您告诉程序更改引用a。由于const约束,这是不允许的。
另一方面,a.bar = 'foo'将修改 * 由a引用的 * 值,而不是引用本身。

erhoui1w

erhoui1w2#

你把一个对象赋给引用类型的const,现在如果你给对象添加新的键或者修改已有的键的值,你可以这么做,因为person保留了那个对象的引用,通过使用person.age,你改变的是对象的值,而不是引用,但是如果你试图像这样给person赋一个新的引用

const person = { name: 'test', age: 20 };
  person = { name: 'hi', age: 10 };
  console.log(person);

您将收到错误未捕获的TypeError:赋值给常量变量。
数组和对象都是引用类型,通过使用相同的引用,你可以在对象中添加或删除键,也可以改变值。与使用数组一样,你可以推送新值,也可以弹出新值,但不能给那个常量分配新的引用。

ruarlubt

ruarlubt3#

const的行为与object不同,因为当您创建如下内容时:

const person = {name:"test",age:20};

这里,person在其中保存引用(内存地址),当您更改object中的某些数据时,其引用不会更改,但key:value对会更改,这就是它在对象情况下不显示错误的原因。

相关问题