首页前端开发JavaScriptjavascript中的深拷贝浅拷贝

javascript中的深拷贝浅拷贝

时间2023-11-29 14:02:13发布访客分类JavaScript浏览369
导读:在JavaScript中,深拷贝和浅拷贝是两种常见的对象拷贝方式。当我们需要复制对象时,我们可以选择使用深拷贝或浅拷贝。具体来说,深拷贝会创建一个新的对象,在拷贝前后的对象中,每个属性的值均不相同。而浅拷贝只是简单的复制指针,所以在拷贝后的...

在JavaScript中,深拷贝和浅拷贝是两种常见的对象拷贝方式。当我们需要复制对象时,我们可以选择使用深拷贝或浅拷贝。具体来说,深拷贝会创建一个新的对象,在拷贝前后的对象中,每个属性的值均不相同。而浅拷贝只是简单的复制指针,所以在拷贝后的对象中,指向原始对象的地址相同。

下面以一个简单的JavaScript对象为例来说明深拷贝和浅拷贝的区别。假设我们有以下对象:

const obj = {
name: 'Lucas',age: 30,address: {
city: 'BeiJing',country: 'China'}
,arr: ['JavaScript', 'Python', 'Java']}

深拷贝会递归地复制对象,所有数据都会被复制,包括对象中嵌套的其他对象和数组。因此,在复制后的对象中,每个字段都将是原始对象的复制。

function deepClone(obj) {
if (typeof obj !== 'object') {
return obj}
let result = obj instanceof Array ? [] : {
}
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key])}
}
return result}
const newObj = deepClone(obj)

浅拷贝只复制对象的地址,而非对象本身。因此,在拷贝后改变对象中的一个属性会影响到原始对象和拷贝后的对象。以下是一些示例代码:

// Object.assignconst newObj = Object.assign({
}
, obj)// Spread Operatorconst newObj = {
...obj}
    // Array.slice()const newArr = obj.arr.slice()

因为浅拷贝只复制地址,所以在修改原始对象中嵌套的对象或数组时,会使拷贝的值也发生变化:

obj.address.city = 'ShangHai'console.log(newObj.address.city) // 'ShangHai'obj.arr.push('Ruby')console.log(newObj.arr) // ['JavaScript', 'Python', 'Java', 'Ruby']

在实际开发中,选择使用何种方式取决于情况。如果我们需要在新对象中完全复制原始对象,则使用深拷贝。如果我们不希望新对象和原始对象之间存在相互影响,则使用浅拷贝。

深拷贝通常比浅拷贝耗费更多资源,因为它需要递归复制整个对象树。如果我们拷贝的对象含有一个很大的嵌套结构,深拷贝就可能成为性能瓶颈。针对这个问题,有一些常见的解决方案,如使用JSON.stringify()和JSON.parse()结合的方法:

const newObj = JSON.parse(JSON.stringify(obj))

这个方法将对象先序列化成一个JSON字符串,然后再将其反序列化成一个新对象。这样可以有效的实现深拷贝,但也有一些限制。例如,JSON.stringify()无法序列化一些特定的值,如undefined、NaN和Infinity,还有包含循环引用的对象。

在处理拷贝问题时,我们需要根据具体的需求来选择正确的拷贝方式。在实际开发中,我们经常需要在对象间传递和操作数据,则认真考虑拷贝的方式才能更好地处理对象相关问题。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: javascript中的深拷贝浅拷贝
本文地址: https://pptw.com/jishu/560525.html
css将图片显示白色 javascript中的连符号

游客 回复需填写必要信息