JS-引用类型obj的使用注意情况

本文探讨了JavaScript中数组对象引用的问题,分析了当原始数组被重新赋值时,之前保存的引用将不再指向新的数组,从而导致数据不同步的现象。文中提供了两种解决方法:重新赋值或者清空原有数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中碰到一个数组对象引用问题大概如下:

1.基本操作

this._list = this.baseData.list;

在接收服务器数据时 数据发生了变化

this.baseData.list = [];

this.baseData.list = severData.list;

2.发现问题

然后使用该数组对象的引用时发现引用对象和本来的数组对象不一样 this._list !== this.baseData.list(伪代码)

3.问题解析

这是因为本来的数组对象在接收服务器数据时,重新引用了一块内存,就是说该变量引用的内存发生了变化,

而此时this._list变量指向的内存还是之前的内存,所以导致两个对象的值不一样

4.处理方法

要么重新赋值,要么原来的对象不重新赋值,而是清空数组,然后获取数组的每一项即可

5.参考文章:https://www.cnblogs.com/yuyifan/p/6204365.html

 

 

<think>好的,我现在需要回答用户关于JavaScript中Object.freeze方法对引用类型的影响及其行为特性的问题。首先,我得回忆一下Object.freeze的基本功能。根据提供的引用资料,Object.freeze会冻结一个对象,阻止添加新属性、删除旧属性或修改现有属性[^1][^3]。不过,用户特别关注的是它对引用类型的影响,比如对象中的嵌套对象是否也会被冻结。 根据引用[4]中的例子,当冻结一个包含嵌套对象的对象时,例如obj1里有obj2,冻结obj1后,直接修改obj1的属性(如a)会被阻止,但修改obj2的属性(如b或c)仍然有效。这说明Object.freeze是浅冻结,只会冻结对象自身的属性,而不会递归冻结嵌套的引用类型属性。因此,如果对象的属性值也是对象,这些子对象不会被自动冻结,需要手动调用Object.freeze来处理。 另外,引用[5]提到在Vue中使用Object.freeze可以避免响应式处理,适用于仅展示的数据。这也说明冻结后的对象不会触发Vue的响应式更新,但如果嵌套对象未被冻结,修改它们可能仍然会影响视图,需要特别注意。 接下来,我需要整理这些点,确保回答覆盖浅冻结特性、引用类型属性的处理、不可变性验证方法以及应用场景。同时,用户可能想知道如何深冻结对象,因此需要提到手动递归或第三方库的方法。最后,生成相关问题时要围绕这些知识点,帮助用户进一步探索。</think>### Object.freeze() 对引用类型的影响与行为特性 #### 1. **浅冻结特性** - **行为**:`Object.freeze()` 仅冻结对象的**直接属性**,不会递归冻结其内部的引用类型属性(如嵌套对象、数组等)[^4]。 ```javascript const obj1 = { a: 1, nested: { b: 2 } }; Object.freeze(obj1); obj1.a = 2; // 修改失败,严格模式下报错 obj1.nested.b = 3; // 修改成功 ``` 上例中,`obj1.nested` 未被冻结,因此可修改其属性。 #### 2. **引用类型属性的表现** - **深层修改**:若对象属性值为引用类型(如对象、数组),冻结外层对象后,仍可修改其内部属性或元素。 - **替换引用**:无法直接替换整个引用类型的属性值(因属性本身被冻结): ```javascript obj1.nested = {}; // 替换失败,严格模式下报错 ``` #### 3. **不可变性的验证** - 使用 `Object.isFrozen()` 可验证对象是否被冻结: ```javascript console.log(Object.isFrozen(obj1)); // true console.log(Object.isFrozen(obj1.nested)); // false ``` #### 4. **深冻结的实现** - 需手动递归冻结嵌套的引用类型属性: ```javascript function deepFreeze(obj) { Object.freeze(obj); Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object' && !Object.isFrozen(obj[key])) { deepFreeze(obj[key]); } }); } ``` #### 5. **应用场景** - **数据保护**:防止核心配置对象被意外修改[^3]。 - **性能优化**:在Vue等框架中冻结无需响应式的数据,减少资源消耗[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值