问题描述
我一直在使用 let
和 const
进行一些练习,并发现了一些有趣的 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
,但不会修改引用本身。
const
对 object
的行为不同,因为当您创建类似以下内容时:
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。
数组和对象都是引用类型,通过使用相同的引用,您可以添加或删除对象的键或更改值。与使用数组相同,您可以推送新值或弹出但不能为该常量分配新引用。