js中对象数据类型的深拷贝方法(5种)

本文介绍了JavaScript中实现对象深拷贝的五种方法,包括JSON暴力转换、拓展运算符+解构赋值、Object.assign()、遍历对象以及递归循环深拷贝。这些方法各有优缺点,例如JSON方法会丢失函数和undefined,Object.assign()只进行浅拷贝等。深入理解这些拷贝方式对于优化代码和避免潜在问题至关重要。
摘要由CSDN通过智能技术生成

目录

一、使用JSON暴力转换

二、 使用拓展运算符+解构赋值

三、 使用对象的合并,即通过Object.assign()方法

四、通过遍历对象

五、利用循环递归


一、使用JSON暴力转换

        通过JSON.stringify() 和 JSON.parse() 将对象转为字符串之后在转为对象。

var obj = {name:'123'};
var obj2 = JSON.parse(JSON.stringify(obj))

二、 使用拓展运算符+解构赋值

        该方法的局限性在于,当值为undefined、function、symbol会在转换过程中被忽略。

var obj = {name:'123',age:13};
var obj2 = {...obj}

三、 使用对象的合并,即通过Object.assign()方法

        注意:该方法的第一个参数必须是空对象

var obj = {name:'123',age:13};
var obj2 = Object.assign({},obj);

四、通过遍历对象

var obj1 = {name:"123"};
var obj2 = {};
for(x in obj1) {
    obj2[x] = obj1[x];
}

五、利用循环递归

        以上四种方法只能进行一层拷贝,即当对象的属性值也是对象时,就无法实现该属性的深拷贝,在这里提供一种利用循环递归进行深拷贝的方法。

    var obj = {
        name: "123",
        sex: { age: "小花" }
    };
    var newObj = {};
    function deepClone(obj, newObj) {
        var newObj = newObj || {};
        for (let key in obj) {
            if (typeof obj[key] == 'object') {
                newObj[key] = (obj[key].constructor === Array) ? [] : {}
                deepClone(obj[key], newObj[key]);
            } else {
                newObj[key] = obj[key]
            }
        }
        return newObj;
    }
    console.log(deepClone(obj, newObj));//{name: "123",sex: {age: '小花'}}

### 回答1: 在 JavaScript ,所有基本数据类型(即除了对象以外的数据类型)都是按值传递的,因此可以通过简单地赋值来实现它们的深拷贝。例如: ``` let num = 5; let numCopy = num; ``` 上面的代码会创建一个数字 5 的副本。同样的方法也可以用于字符串、布尔值和空值(null)。 对于特殊的数据类型 `undefined`,它是无法被赋值的,因此不能用来进行深拷贝。 另外,对于对象类型的数据,需要使用更加复杂的方法来实现深拷贝,例如使用递归的方法或者使用 JSON 序列化和反序列化的方法。 ### 回答2: 在JavaScript,有六基本数据类型,包括字符串、数字、布尔值、null、undefined和Symbol。要进行深拷贝,即创建一个完全独立于原始数据的副本,以下是一可行的方法: 1. 对于字符串、数字和布尔值等基本数据类型,它们是不可变的,深拷贝是多余的,直接赋值给新的变量即可。 ```javascript let str = "Hello"; let num = 123; let bool = true; let strCopy = str; let numCopy = num; let boolCopy = bool; ``` 2. 对于null和undefined,它们没有可拷贝的值,直接赋值给新的变量即可。 ```javascript let nullValue = null; let undefinedValue = undefined; let nullCopy = nullValue; let undefinedCopy = undefinedValue; ``` 3. 对于Symbol,使用Symbol的静态方法Symbol.for()来创建全局共享的Symbol,并且直接赋值给新的变量。 ```javascript let sym = Symbol("mySymbol"); let symCopy = sym; ``` 需要注意的是,以上方法都是浅拷贝,即如果这个原始值所在的变量改变了,拷贝值也会跟着改变。如果要实现深拷贝,即使原始值改变,拷贝值也不受影响,可以使用工具库,如lodash的cloneDeep()方法。 ```javascript const _ = require('lodash'); let obj = { name: "John", age: 25 }; let objCopy = _.cloneDeep(obj); ``` 上述代码使用了lodash库的cloneDeep()方法,可以实现对对象深拷贝。这样,在拷贝对象后,即使原始对象发生了变化,拷贝对象仍然保持不变。但要注意,这方法需要引入第三方库。 ### 回答3: 在JavaScript,有六基本数据类型,分别是:String、Number、Boolean、Undefined、Null和Symbol。下面是对这些数据类型深拷贝的解释: 1. String类型的深拷贝:由于字符串是不可变的,所以在深拷贝时不需要特殊处理,直接将原字符串赋值给新变量即可。 例如:let newString = oldString; 2. Number类型的深拷贝:由于数字也是不可变的,深拷贝时同样直接将原数字赋值给新变量即可。 例如:let newNumber = oldNumber; 3. Boolean类型的深拷贝:布尔值也是不可变的,直接赋值即可。 例如:let newBoolean = oldBoolean; 4. Undefined和Null类型的深拷贝:由于这两类型的取值只有一个,分别是undefined和null,它们本身就是不可变的,所以深拷贝时同样直接赋值即可。 例如:let newUndefined = oldUndefined; let newNull = oldNull; 5. Symbol类型的深拷贝:由于Symbol类型的值是唯一且不可变的,深拷贝时也只需将原Symbol赋值给新变量。 例如:let newSymbol = oldSymbol; 需要注意的是,以上所述的深拷贝针对的是基本数据类型,也就是说它们都是按值传递的。而如果是引用数据类型(例如对象和数组),深拷贝需要使用其他方法,因为直接赋值只会拷贝引用,而不是对象或数组的实际内容。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值