深拷贝就是拷贝值,并在内存中开辟一块新的空间存放,不会影响原数据了

1. 利用JSON.parse(JSON.stringify(要拷贝的数据))

// 缺点是无法处理函数和正则   (会丢失)
const obj = {
    uname: '张三',
    age: 24
}
const obj1 = JSON.parse(JSON.stringify(obj))
console.log(obj1) // {uname: '张三', age: 24}
console.log(obj1 === obj) // false

2. 利用第三方库(lodash)

const _ = require('lodash');

const obj = {
    uname: 'zs',
    age: 24,
    say() {
        console.log('会说话')
    }
}

const obj1 = _.cloneDeep(obj)
console.log(obj1) // { uname: 'zs', age: 24, say: [Function: say] }
console.log(obj1 === obj) // false

3. 利用递归

<body>
    <script>
        // 首先定义一个函数,判断传入的参数是不是符合要求(数据类型为对象且不能为null,typeof null 为 object)
        function isObject(obj) {
            return typeof obj === "object" && obj !== null;
        }
        function copy2(source) {
            // 判断参数是不是简单数据类型,是就原样返回
            if (!isObject(source)) return source;
            // 判断参数是不是数组,是就赋值一个空数组。否则就赋值一个空对象
            let target = Array.isArray(source) ? [] : {};
            // 对参数进行遍历
            for (let i in source) {
                // console.log(i) // i 是 key  或  索引
                // 判断参数,如果是对象,判断是否包含某个键
                // 如果是数组,则判断是否有索引对应的值
                if (source.hasOwnProperty(i)) {
                    // 再判断参数中遍历的某个属性的数据类型是否是对象,简单来说就是判断是不是含有方法或对象
                    // 方法Function也属于对象
                    if (isObject(source[i])) {
                        // 含有方法或对象,就递归调用自身,对方法或对象进行遍历。把遍历后的结果,都赋值给对应的键或索引
                        target[i] = copy2(source[i]);
                    } else {
                        // 不含方法或对象,则按键或索引赋值
                        target[i] = source[i];
                    }
                }
            }
            return target;
        }

        // 对象
        const obj = {
            uname: 'zs',
            age: 24,
            say() {
                return '唱'
            },
            cat: {
                name: '咪咪',
                age: 6,
                skill: function () {
                    return '卖萌'
                }
            }
        }
        const obj1 = copy2(obj)
        console.log(obj1) // {uname: 'zs', age: 24, cat: {…}, say: ƒ}
        console.log(obj1 === obj) // false
        // 数组
        const arr = [1, 2, 3, 4, 5, [6, 7, 8]]
        const arr1 = copy2(arr)
        console.log(arr1) // [1, 2, 3, 4, 5, Array(3)]
        console.log(arr1 === arr) // false
    </script>
</body>

原文链接:https://blog.csdn.net/qq_52845451/article/details/126554955

最后修改:2023 年 10 月 30 日
如果觉得我的文章对你有用,请随意赞赏