JavaScript对象复制、扩展(改变原对象的引用,避免原对象被动态的改变值);

本文探讨JavaScript中对象赋值时遇到的问题,解释原始类型与对象类型的存储方式,并提供解决对象复制时引用问题的方法,包括使用jQuery的extend方法和自定义对象复制函数。

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

javaScript对象在赋值时,常常直接使用”=”,觉得可以直接把一个一个对象赋值给另一个对象;

javaScript中的数据类型分为两类,原始类型和对象类型;
1.原始类型:包括数值,字符串、布尔值、null、undefined;
2.对象类型:对象即属性的集合(function、Array);

先了解数据类型在计算机中的存储;
1.原始类型:存储的是对象的原始数据;
2.对象类型:对象的原型也是引用类型,对象类型的值单独存放。对象原型的方法和属性放在内存中,通过原型链的方式来指向这个地址;所以对象类型存储的是对象的引用地址;

一、原始类型:

字符串:

var a = "a";
var b = a;
b = "b";
console.log("a:"+a);// "a"
console.log("b:"+b);// "b"

布尔类型

var a = true;
var b = a;
b = false;
console.log("a:"+a);// true
console.log("b:"+b);// false

数值

var a = 1;
var b = a;
b = 2;
console.log("a:"+a);// 1
console.log("b:"+b);// 2

重以上的离职可以看出,原始对象的复制,通过”=”的方式仍然能够获得正确的值;

二、对象类型
看代码:

var person = {
    name:"z",
    age:24,
    child:{
        name:"z-1",
        age:2
    }
}

var person_o = person; 
person_o.child.age = 200;
console.log("person:"+person.child.age);// 200
console.log("person_o:"+person_o.child.age);// 200

对象类型在复制的时候,只是将对象的引用复制了,将person对象的引用地址值赋值给了person_o
所以在perison_o改变对象属性值的时候,person的引用也发生了改变,它们在内存中获取的都是同
一个对象;

解决方案;

JQuery中有extend()方法合并多个对象;
使用:var newSrc=$.extend({},src1,src2,src3…);很轻松的搞定;

javaScript中没有明确类的概念,我们要针对每个对象类型,写个方法,复制对象中的每个属性及方法;

/**
 *  对象复制(克隆)方法,改变对原对象的引用,生成新对象
 *  复制时包括对象中的属性,方法;
 *  其中dataType()方法请参照方法库:[javascript常用方法整理;(不断更新)](http://blog.youkuaiyun.com/j_y_x_8/article/details/52045716)
 * 
 *  @obj:数据
 **/
function clone(obj){
    var result = {},objClass=dataType(obj);
    if (objClass==="Object") {
        result = {};
    }else if (objClass==="Array"){
        result = [];
    }else{
        return obj;
    }
    // 遍历obj对象的每一个属性
    for ( var key in obj ){
        var = obj[key];
        if (dataType(val)==="Object"){
            result[key] = arguments.callee(val);
        }else if(dataType(val)==="Array"){
            result[key] = arguments.callee(val);
        }else{
            result[key] = obj[key];
        }
    }
    return result;
};
### JavaScript 深拷贝数组对象后修改嵌套数组的最佳实践 在 JavaScript 中,当需要对嵌套数组进行操作而不改变始数组时,深拷贝是一种常见的解决方案。以下是关于如何实现最佳实践的具体说明: #### 使用 JSON 方法进行深拷贝 JSON 的 `stringify` 和 `parse` 可以快速完成深拷贝,但对于复杂的数据结构(如包含函数、`undefined` 或循环引用的情况),这种方法并不适用。 ```javascript const originalArray = [[1, 2], [3, 4]]; const deepCopiedArray = JSON.parse(JSON.stringify(originalArray)); deepCopiedArray[0][0] = 99; console.log(originalArray); // 输出: [[1, 2], [3, 4]] console.log(deepCopiedArray); // 输出: [[99, 2], [3, 4]] ``` 此方法适用于简单的数据结构[^4]。 --- #### 利用递归实现真正的深拷贝 为了处理更复杂的场景,可以通过编写递归来逐层复制每一级的嵌套内容。这种方式能够兼容多种数据类型,包括对象、数组以及基本数据类型。 ```javascript function deepClone(obj) { if (obj === null || typeof obj !== 'object') { return obj; } const clone = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key]); } } return clone; } // 测试代码 const nestedArray = [[1, { a: 2 }], [3, 4]]; const clonedNestedArray = deepClone(nestedArray); clonedNestedArray[0][1].a = 99; console.log(nestedArray); // 输出: [[1, { a: 2 }], [3, 4]] console.log(clonedNestedArray); // 输出: [[1, { a: 99 }], [3, 4]] ``` 上述递归方法可以有效应对多层嵌套数组或对象,并确保任何级别的更改都不会影响到源数据[^3]。 --- #### ES6 扩展运算符的局限性 虽然扩展运算符 (`...`) 是一种简洁的方式来创建浅拷贝,但它无法完全满足深层嵌套的需求。 ```javascript const shallowCopyExample = [...originalArray]; shallowCopyExample[0][0] = 99; console.log(originalArray); // 输出: [[99, 2], [3, 4]] —— 始数组也被改变了 console.log(shallowCopyExample); // 输出: [[99, 2], [3, 4]] ``` 因此,在涉及深层次嵌套时,建议避免仅依赖扩展运算符[^2]。 --- #### 结合第三方库简化开发流程 某些流行的工具库(例如 Lodash)提供了成熟的深拷贝功能,可以直接调用而无需手动实现逻辑。 ```javascript const _ = require('lodash'); const lodashDeepClonedArray = _.cloneDeep([[1, 2], [3, 4]]); lodashDeepClonedArray[0][0] = 99; console.log(lodashDeepClonedArray); // 输出: [[99, 2], [3, 4]] ``` 这种方案不仅高效而且稳定可靠,特别适合大型项目中频繁使用的场景。 --- ### 总结 针对不同的需求可以选择合适的深拷贝策略:如果是基础应用可尝试 JSON 转换;追求灵活性则推荐自定义递归算法;而对于生产环境下的高可靠性诉求,则引入成熟框架会更加明智。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值