javascript浅拷贝和深拷贝(javascript 浅拷贝)

1年前 (2023-09-06)阅读84回复0
郝甜甜
郝甜甜
  • 注册排名10011
  • 经验值0
  • 级别
  • 主题0
  • 回复0
楼主

Javascript中的浅拷贝指的是创建一个新的对象来存储原始对象的值,但是新对象中的某些属性仍然引用了原始对象的值。这种拷贝方法在一些情况下非常有用,但是也需要注意一些问题。

我们先来看一个例子:

var original = {
name: "张三",
age: 20,
address: {
province: "广东",
city: "深圳"
}
};
var copy = Object.assign({}, original); // 使用Object.assign()进行浅拷贝
console.log(copy);
// {
//   name: "张三",
//   age: 20,
//   address: {
//     province: "广东",
//     city: "深圳"
//   }
// }
original.address.city = "北京";
console.log(copy);
// {
//   name: "张三",
//   age: 20,
//   address: {
//     province: "广东",
//     city: "北京"
//   }
// }

从上面的例子可以看出,浅拷贝虽然创建了一个新的对象,但是新对象的地址引用和原始对象是不同的。当我们修改原始对象中的某些值时,新对象中引用原始对象的值也发生了改变。

我们再来看一些常用的浅拷贝方法:

// 对象扩展的方式进行浅拷贝
var copy1 = {...original};
// 使用Array.from()进行浅拷贝
var copy2 = Array.from(original);
// 使用slice()进行浅拷贝
var copy3 = original.slice();

上面几种方法的用法和Object.assign()类似,都可以将原始对象进行浅拷贝。但需要注意的是,它们只针对简单对象和数组进行拷贝,当对象中包含了引用类型的值时,也需要进行额外的处理。

再来看一个例子:

var original = {
name: "张三",
age: 20,
address: {
province: "广东",
city: "深圳"
}
};
// 使用对象扩展进行浅拷贝
var copy1 = {...original};
// 修改原始对象中的值
original.address.city = "北京";
console.log(copy1);
// {
//   name: "张三",
//   age: 20,
//   address: {
//     province: "广东",
//     city: "北京"
//   }
// }

可以看到,当原始对象中包含了引用类型的值时,使用对象扩展进行浅拷贝仍然会出现相同的问题。因此,我们需要使用特殊的方法来进行处理。

常用的方法包括使用JSON进行深拷贝、手动递归拷贝等。在这里我只介绍一种简单的方式,即使用Object.assign()进行深拷贝:

var original = {
name: "张三",
age: 20,
address: {
province: "广东",
city: "深圳"
}
};
// 使用Object.assign()进行深拷贝
var copy = JSON.parse(JSON.stringify(original));
// 修改原始对象中的值
original.address.city = "北京";
console.log(copy);
// {
//   name: "张三",
//   age: 20,
//   address: {
//     province: "广东",
//     city: "深圳"
//   }
// }

需要注意的是,这种方法不能处理原始对象中包含函数、正则表达式等特殊类型的值。

在使用浅拷贝时,需要注意以下几点:

  • 浅拷贝创建了一个新的对象,但新对象中某些属性仍然引用了原始对象的值。
  • 当原始对象中包含引用类型的值时,使用浅拷贝需要进行额外的处理。
  • 浅拷贝不能处理原始对象中包含函数、正则表达式等特殊类型的值。

综上所述,浅拷贝在一些情况下非常有用,但也需要注意其问题和使用方法。在开发中需要谨慎使用,根据实际情况选择合适的拷贝方式。

本文可能转载于网络公开资源,如果侵犯您的权益,请联系我们删除。

本文地址:https://www.pyask.cn/info/1300.html

0
回帖

javascript浅拷贝和深拷贝(javascript 浅拷贝) 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息