(浅拷贝,深拷贝)复制数组元素时,修改被复制的元素时,另一个元素会跟着变化

copy(item) {
            
              this.viewModel.push(item)
        },

复制数组,将item元素push到this.viewModel数组中实现复制,但是编辑复制元素时原本的元素会更着变化。直接push进去是浅拷贝了item,因此尝试将item深拷贝一下再push.

深拷贝的几种方式

1.使用 JSON 方法

//测试用例
let originalObject = { a: 1, b: { c: 2 } };
let copiedObject = JSON.parse(JSON.stringify(originalObject));
copiedObject.b.c = 3;
console.log(originalObject); // { a: 1, b: { c: 2 } }
console.log(copiedObject); // { a: 1, b: { c: 3 } }

这种方法简单易用,但有一些限制,比如无法处理函数、循环引用等。 

2.使用递归方法

//测试用例
function deepCopy(obj) {
    if (obj === null || typeof obj !== 'object') {
        return obj;
    }
    let newObj = Array.isArray(obj) ? [] : {};
    for (let key in obj) {
        newObj[key] = deepCopy(obj[key]);
    }
    return newObj;
}
let originalObject = { a: 1, b: { c: 2 } };
let copiedObject = deepCopy(originalObject);
copiedObject.b.c = 3;
console.log(originalObject); // { a: 1, b: { c: 2 } }
console.log(copiedObject); // { a: 1, b: { c: 3 } }

 3.使用第三方库

如果您不想自己实现深拷贝函数,可以使用第三方库如 Lodash 的 _.cloneDeep() 方法来进行深拷贝。

npm install lodash

// 在vue.js中引入 lodash
import lodash from 'lodash';

// 在需要的地方使用 cloneDeep 方法
let clonedObj = lodash.cloneDeep(obj);

4.使用Object.assign()

//测试用例
let originalObject = { a: 1, b: { c: 2 } };
let copiedObject = Object.assign({}, originalObject);
copiedObject.b.c = 3;
console.log(originalObject); // { a: 1, b: { c: 2 } }
console.log(copiedObject); // { a: 1, b: { c: 3 } }

 Object.assign() 只会进行浅拷贝,对于嵌套对象仍然是浅拷贝。

5.使用structuredClone()

在浏览器环境中,并且需要深拷贝可序列化的对象,可以使用 structuredClone() 方法

//测试用例
let originalObject = { a: 1, b: { c: 2 } };
let copiedObject = structuredClone(originalObject);
copiedObject.b.c = 3;
console.log(originalObject); // { a: 1, b: { c: 2 } }
console.log(copiedObject); // { a: 1, b: { c: 3 } }

因为我是在pc端最后选择了使用structuredClone()方法

在vue项目中直接使用structuredClone()方法虽然不影响使用但是会报错。所以需要先定义。

import Vue from 'vue'

const structuredClonePlugin = {
    install(Vue) {
        Vue.prototype.$structuredClone = function (obj) {
            return JSON.parse(JSON.stringify(obj))
        }
    }
}

// 在 Vue 实例中使用
Vue.use(structuredClonePlugin)

最后调用structuredClonePlugin()实现。

//复制拷贝
copy(item) {
              let copiedObject = this.$structuredClone(item)
              this.viewModel.push(copiedObject)
        },

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值