js赋值改变后,原数据也发生改变

本文探讨了JavaScript中对象的传值与传址的区别,解释了如何避免修改一个对象时另一个对象发生变化的问题,并介绍了基础类型与引用类型的特性。

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

问题:

声明变量obj1,obj2=obj1,修改obj2的age字段,打印发现obj1的值也发生了改变

    var obj1 = {
      name: '张三',
      age: 18,
      sex: '男'
    }
    var obj2 = obj1;

    console.log('obj2:', obj2)
    obj2.age = 22
    console.log('obj2:', obj2)
    console.log('obj1:', obj1)

需求:

修改obj2后obj1值不发生改变

解决:

因为在给obj2赋值的时候,进行了传址操作(传址操作指的是在给obj2赋值的时候,存储的实际上是obj1的数据地址,而不是对obj1数据的拷贝或原始数据,所以当obj2数据修改的时候,是通过地址进行的修改,所以相同数据地址的obj1也发生了改变)

 

修改obj2赋值的方法

var obj2 = JSON.parse(JSON.stringfy(obj1));

拓展

传值指的是在对变量赋值时,是对原始数据进行了拷贝。拷贝数据与原始数据是相互独立互不影响的。对赋值后的数据进行修改,修改的只是拷贝的数据,对原始数据没有影响

根据数据的操作方式不同,可以将数据分为两大类型:基础类型和引用类型

基础类型:number类型、boolean类型和string类型,其操作方式为传值

引用类型:array类型、object类型、function类型,其操作方式为传址

### JavaScript 中数组赋值行为 在 JavaScript 中,直接通过 `=` 赋值符进行数组赋值并不会创建新数组,而是让两个变量指向同一个内存地址。这意味着任何一方的变化都会反映到另一方。 ```javascript let arr = [1, 2, 3]; let arrCopy = arr; arrCopy.push(4); console.log(arr); // 输出: [1, 2, 3, 4] console.log(arrCopy); // 输出: [1, 2, 3, 4] ``` 为了防止这种情况发生,可以通过深拷贝的方式创建一个全新的独立副本[^3]。 ### 实现深拷贝的方法 #### 方法一:使用 JSON 序列化/反序列化 这种方法适用于纯数组或对象结构,不支持函数、`undefined` 或复杂的数据类型(如日期对象)。 ```javascript function deepCloneArray(arr) { return JSON.parse(JSON.stringify(arr)); } let originalArr = [1, { a: 'b' }, true]; let clonedArr = deepCloneArray(originalArr); clonedArr[1].a = 'c'; console.log(originalArr[1].a); // b console.log(clonedArr[1].a); // c ``` 此方法简单易用,但对于更复杂的场景可能不够健壮[^1]。 #### 方法二:递归遍历法 该方法能够处理更多类型的元素,并且可以自定义克隆逻辑。 ```javascript function recursiveDeepClone(obj) { if (obj === null || typeof obj !== 'object') return obj; let copy = Array.isArray(obj) ? [] : {}; Object.keys(obj).forEach(key => { copy[key] = recursiveDeepClone(obj[key]); }); return copy; } ``` 这种方式更加灵活通用,适合大多数情况下的深拷贝需求。 #### 方法三:利用 ES6 的扩展运算符 虽然这看起来像是浅拷贝,但如果结合其他技术也可以实现深层次的复制效果: ```javascript const shallowClone = [...originalArr]; // 浅拷贝一层 // 对于多维数组,则需进一步处理内部项 ``` 需要注意的是,单纯使用扩展运算符仅能完成最外层的一级深拷贝,在面对嵌套结构时仍需额外措施确保真正意义上的深层复制[^4]。 ### 总结 为了避免修改新数组时影响数组,推荐采用上述提到的任一种深拷贝方案。每种方法都有其适用范围和局限性,具体选择取决于实际应用场景的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值