const声明对引用对象的保护并不安全

本文通过一个简单的JavaScript代码示例,演示了对象在赋值过程中引用传递的特点,以及当修改一个变量时如何影响到原始对象。这有助于理解JavaScript中变量作用域和对象属性更改的影响。

代码:

const a={4:5,2:3};
console.log(typeof(a));
var b=a;
b['9']=10;

console.log(a);
console.log(b);

运行结果:

在 JavaScript 中,使用 `const` 声明的对象是可以修改其属性值的。`const` 关键字的作用是确保变量绑定的引用地址不可更改,而不是保证对象本身的属性不可变。这意味着一旦声明了一个指向对象的常量引用,就不能再将其重新赋值为另一个对象或者基本类型值,但可以修改该对象内部的属性。 例如: ```javascript const obj = { name: 'codereasy' }; obj.name = '123'; // 这是允许的 console.log(obj); // 输出 { name: '123' } ``` 在这个例子中,虽然 `obj` 是通过 `const` 声明的,但是我们仍然能够修改它的 `name` 属性[^3]。 然而,如果我们尝试将 `obj` 重新赋值给一个新的对象,则会抛出错误: ```javascript // 下面这行代码会导致 TypeError obj = { name: 'new value' }; ``` 这种行为与 C++ 中 `const` 的用法有所不同,在 C++ 中如果一个对象被声明为 `const`,那么它所有的非 `mutable` 成员都不能被修改[^2]。而在 JavaScript 中,`const` 提供的是对值的引用为常量的绑定,并不阻止修改对象的内容[^4]。 ### 深入理解 为了更深入地理解这一点,我们可以考虑 `const` 在处理原始数据类型和复杂数据类型时的不同表现: - **对于原始数据类型**(如数字、字符串、布尔值等),由于它们直接存储在变量所指向的内存地址中,因此使用 `const` 声明后确实无法改变这些值,因为这相当于试图修改内存中的具体数值。 - **对于复杂数据类型**(如数组、对象等),变量实际上保存的是指向堆内存中实际数据位置的一个指针。当使用 `const` 声明时,这个指针本身不能被改变以指向其他地方,但是指针指向的数据结构却可以被修改。 如果你需要创建一个完全不可变的对象,JavaScript 提供了一些方法来实现这一目标,比如使用 `Object.freeze()` 方法: ```javascript const frozenObj = Object.freeze({ name: 'codereasy' }); frozenObj.name = '123'; // 在严格模式下会抛出异常;否则静默失败 console.log(frozenObj.name); // 仍然是 'codereasy' ``` `Object.freeze()` 不仅阻止了对象属性的添加或删除,还防止了现有属性值的更改以及配置特性的变化。 此外,还可以使用 `Object.seal()` 来密封一个对象,这样可以阻止新属性的添加,同时标记所有现有的属性为不可配置,但已有的可写属性仍能被修改其值。 总结来说,`const` 对于对象而言,保障的是引用地址不变,而非内容不变。若想让对象本身也变得不可变,就需要借助像 `Object.freeze()` 这样的工具函数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值