vue~对象的浅拷贝

浅拷贝

当我们想要复制一段数据的时候吗,我们就会用到拷贝;拷贝数据又分为了浅拷贝和深拷贝,浅拷贝指复制对象或数组的顶层结构,如果对象或数组中有引用类型的属性值,复制的是引用(地址)而非值;而深拷贝则是递归复制完整的对象或数组,包括嵌套的子对象或子数组,生成一个全新的对象,新对象和原对象的引用地址不同。

javascript中的实现
JavaScript 中可以使用不同方法实现对象的浅拷贝。浅拷贝只复制对象的第一层属性,不会复制嵌套对象内部的属性。以下是几种常见的浅拷贝方法:

1. 扩展运算符(Spread Operator):
使用扩展运算符 … 可以创建一个对象的浅拷贝:
const originalObj = { name: ‘John’, age: 30 };
const newObj = { …originalObj };
newObj.name = ‘Jane’;
console.log(originalObj.name); // 输出 ‘John’,原始对象不受影响
console.log(newObj.name); // 输出 ‘Jane’,新对象被修改

2. Object.assign() 方法:
Object.assign() 方法可以将一个或多个对象的属性复制到目标对象中,也可以用来创建对象的浅拷贝:
const originalObj = { name: ‘John’, age: 30 };
const newObj = Object.assign({}, originalObj);
newObj.name = ‘Jane’;

console.log(originalObj.name); // 输出 ‘John’,原始对象不受影响
console.log(newObj.name); // 输出 ‘Jane’,新对象被修改
这些方法都可以用来创建对象的浅拷贝,但请注意,如果对象中包含嵌套对象,这些嵌套对象仍然是引用关系,所以修改嵌套对象会影响到原始对象。如果需要深拷贝,即递归复制对象及其嵌套对象的属性,需要使用其他方法,如 Lodash 的 _.cloneDeep() 方法。

vue.js中使用扩展运算符实现浅拷贝
let searchForm = {…this.searchForm};
this.searchForm 是一个对象,通过 {…this.searchForm} 这个表达式,创建了一个新对象,新对象包含了与 this.searchForm 相同的属性和属性值。

这个操作实际上是在创建 searchForm 对象的副本,而不是将原始对象直接赋值给 searchForm。这意味着如果你后续修改 searchForm,不会影响到原始的 this.searchForm 对象,因为它们是两个不同的对象。
这种操作通常用于对象或数组的复制,以便在不影响原始数据的情况下进行修改。这是一种浅拷贝,因为它只复制了对象的第一层属性,如果对象中包含了嵌套对象,嵌套对象仍然是引用,修改嵌套对象会影响到原始对象。
以下是一个示例:
let originalObj = { name: ‘John’, age: 30 };
let newObj = { …originalObj };
newObj.name = ‘Jane’;

console.log(originalObj.name); // 输出 ‘John’,原始对象不受影响
console.log(newObj.name); // 输出 ‘Jane’,新对象被修改
这是Vue.js中常见的一种数据处理方式,通常用于确保在处理数据时不会直接修改原始数据,以便在需要时进行撤销或回滚操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Vue中,我们通常使用深拷贝浅拷贝来复制Vue对象,这两种方法都有其适用的场景和局限性。 1. 浅拷贝浅拷贝是指将对象的引用复制到新变量中,新变量只是指向原始对象的内存地址,这意味着如果我们对新对象进行更改,原始对象也会发生更改。 Vue提供了一种浅拷贝对象的方法,可以使用`Object.assign()`或展开运算符`...`,例如: ```javascript let original = { name: 'John', age: 30, address: { city: 'New York', country: 'USA' } } // 使用 Object.assign() 进行浅拷贝 let copy = Object.assign({}, original) // 使用展开运算符 ... 进行浅拷贝 let copy2 = {...original} ``` 在上面的示例中,如果我们更改新的对象中的“address”属性,原始对象也会发生更改,因为它们指向同一个内存地址。 2. 深拷贝: 深拷贝是指将对象及其所有嵌套属性的值复制到新变量中,而不是只复制原始对象的引用。这意味着对新对象进行更改不会影响原始对象Vue不提供默认的深拷贝方法,但是可以使用第三方库如Lodash中的`cloneDeep()`方法或JSON的`parse()`和`stringify()`方法来进行深拷贝。 ```javascript let original = { name: 'John', age: 30, address: { city: 'New York', country: 'USA' } } // 使用 Lodash 的 cloneDeep() 方法进行深拷贝 let copy = _.cloneDeep(original) // 使用 JSON.parse() 和 JSON.stringify() 进行深拷贝 let copy2 = JSON.parse(JSON.stringify(original)) ``` 在上面的示例中,如果我们更改新的对象中的“address”属性,原始对象不会发生更改,因为它们指向不同的内存地址。 需要注意的是,使用`JSON.parse()`和`JSON.stringify()`进行深拷贝时,有一些情况下无法复制对象的一些特定属性,例如函数、RegExp、Date等,因为它们无法被序列化成字符串。在这种情况下,需要使用其他库或自己编写递归复制对象的代码。 ### 回答2: Vue对象的深拷贝浅拷贝是在处理对象拷贝时涉及到的两种不同的操作方法。 浅拷贝是指在拷贝对象时,只拷贝对象的第一层属性值,当源对象和目标对象的属性值是基本数据类型时,目标对象的属性值会完全独立于源对象,但是当属性值是引用类型时,源对象和目标对象的属性值指向同一个内存地址。 例如,在Vue中,我们可以使用浅拷贝来创建一个新的对象,并对其进行修改,而不影响原始对象的值: ```javascript let source = { name: 'Alice', age: 20, skills: ['JavaScript', 'Vue'] }; let copy = Object.assign({}, source); copy.name = 'Bob'; copy.skills.push('React'); console.log(source); // { name: 'Alice', age: 20, skills: ['JavaScript', 'Vue', 'React'] } console.log(copy); // { name: 'Bob', age: 20, skills: ['JavaScript', 'Vue', 'React'] } ``` 从上面的例子中可以看出,浅拷贝只是拷贝对象的第一层属性,当修改拷贝对象的属性时,原始对象的值不会受到影响。但是对象中的引用类型属性(如数组)在浅拷贝中是共享的,因此对拷贝对象的引用类型属性进行修改,会影响到原始对象的值。 相比之下,深拷贝是指在拷贝对象时,递归地拷贝对象的所有层级属性,即使属性值是引用类型,也会在内存中重新创建一个新的引用地址。这样可以实现完全独立的对象拷贝,互不影响。 在Vue中,我们可以使用一些库和方法来实现对象的深拷贝,如`lodash`库的`cloneDeep`方法或者`JSON.parse(JSON.stringify(obj))`。 然而,需要注意的是对于包含循环引用的对象,使用普通的深拷贝方法可能会导致无限递归,进而导致程序崩溃。因此,在实际开发中,对于包含循环引用的对象,需要格外小心处理。 ### 回答3: Vue对象的深拷贝浅拷贝是指对Vue对象进行复制的两种不同方式。 浅拷贝是将原始对象的引用复制一份给新的对象,新对象与原对象共享同一块内存地址。当修改新对象的属性时,原对象的对应属性也会随之改变。这是因为浅拷贝只复制了对象的引用,对于引用类型的属性,只是复制了指向同一块内存地址的指针。既然指针指向同一块内存地址,那么无论是新对象还是原对象,当修改该对象的属性时,都会影响到另一个对象。 深拷贝是创建一个新的对象,并且递归地复制原对象中的所有属性和子属性。深拷贝会完全复制对象及其引用类型属性所指向的内存地址,即使是嵌套的引用类型属性也会一一复制。当修改新对象的属性时,原对象的对应属性不会受到影响,因为它们指向的是两块独立的内存地址。 在Vue开发中,数据的响应式是基于对象的引用关系实现的。当使用浅拷贝进行数据复制时,新对象仍然会指向原对象的引用地址,导致新对象的修改也会影响到原对象,这可能会导致数据更新的不一致性。因此,在需要对Vue对象进行复制时,通常会使用深拷贝来创建一个独立的对象,以保持数据的一致性和独立性。可以使用一些第三方库(如lodash的cloneDeep方法)或者自定义递归方法来实现深拷贝

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackieChan_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值