使用 const 声明的对象的 Wired 行为

问题描述

我一直在使用 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 与对象的行为不同?

解决方法

https://www.w3schools.com/JS/js_const.asp

关键字 const 有点误导。

它没有定义一个常数值。它定义了一个对值的常量引用。

因此,我们无法更改常量原始值,但可以更改常量对象的属性。

const a = {foo: 'bar'}; 定义了一个新对象(因此是一个新引用)。此引用将存储在 a 中。

稍后调用 a = {bar: 'foo'} 时,您告诉程序更改引用 a。由于 const 限制,这是不允许的。

另一方面,a.bar = 'foo' 会将引用的值修改为 a,但不会修改引用本身。

,

constobject 的行为不同,因为当您创建类似以下内容时:

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

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

,

您将一个对象分配给引用类型的 const。现在,如果您向 object 添加新键或修改 key 的现有值,您可以这样做,因为 person 保留了该对象的引用,并且通过使用 person.age 您正在更改 object 的值而不是引用。 但是如果你尝试为这样的人分配一个新的引用

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

你会得到错误 Uncaught TypeError: Assignment to constant variable。

数组和对象都是引用类型,通过使用相同的引用,您可以添加或删除对象的键或更改值。与使用数组相同,您可以推送新值或弹出但不能为该常量分配新引用。