JS--对象的深拷贝与浅拷贝

本文深入探讨了JavaScript中基本类型与引用类型的深拷贝和浅拷贝概念,通过实例对比了基本类型与引用类型在复制过程中的差异,并详细介绍了深拷贝的三种实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章将整理一下深浅拷贝的相关知识。文章包括以下内容:

  1. 基本类型和引用类型
  2. 对象的深拷贝和浅拷贝

基本类型和引用类型
JS中包含两种数据类型,既基本类型和引用类型,基本类型是简单的数据段,它是按值访问的,因为基本类型可以操作保存在变量中的值。而引用类型指的是那些可能由多个值构成的对象。引用类型的值是保存在内存中的对象,在JS中,规定不能直接访问内存中的位置,既不能直接访问内存中的变量。所以在访问引用类型时实际上是按引用访问的。

那么在复制基本类型和引用类型时存在着怎样的不同呢?当从一个变量向另一个变量复制基本类型值时,会在变量对象上创建一个新值,然后把改值复制到新变量分配的位置上。基本类型值复制实际上是生成了一个新的副本,它们参与的操作不会相互收到影响。

var num1 = 10;
var num2 = num1;
console.log(num2); // 10;
num2 = 20;
console.log(num2); // 20;
console.log(num1); // 10;
//num2由num1复制而来,但是改变num2时,原来的num1并不会受到影响。

当从一个变量向另一个变量复制引用类型时,同样会将存储的对象复制一份到新的变量中。不同的是,这个值得副本实际上是一个指针,指针指向存储中的对象。两个变量引用的是同一个对象。因此改变其中一个变量的值,将影响另一个变量的值。

var obj1 = {
	name: 'hyt'
}
var obj2 = obj1;
obj2.name = 'newHyt';
console.log(obj1.name); //  newHyt;

对象的深拷贝和浅拷贝

1、浅拷贝
当复制一个数组/对象时,只是复制了数组/对象的引用,改变数组/对象中的值,另一个数组/对象也会跟着改变,这往往不是我们想要的。

function simpleClone(obj) {
	let newObj = {};
	for (let k in obj) {
		newObj[k] = obj[k];
		return newObj;
	}
}
var obj1 = {a: {b: {c: 1}}};

var obj2 = simpleClone(obj1);
console.log(obj2);
obj2.a.b.c = 'hyt';
obj1.a.b.c = 'hyt';

2、深拷贝
目标是拷贝一个对象时,更改一个变量,另一个变量不受影响。在这里将介绍三种方式实现对象的深拷贝。

对象的深拷贝实现原理: 定义一个新的对象,遍历源对象的属性并赋给新对象的属性

  • 递归实现深拷贝
  • es6的扩展运算符

递归—就是对每一层的数据都实现一次 创建对象->对象赋值 的操作,简单粗暴上代码:

function deepClone(source){
  const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象
  for(let keys in source){ // 遍历目标
    if(source.hasOwnProperty(keys)){
      if(source[keys] && typeof source[keys] === 'object'){ // 如果值是对象,就递归一下
        targetObj[keys] = source[keys].constructor === Array ? [] : {};
        targetObj[keys] = deepClone(source[keys]);
      }else{ // 如果不是,就直接赋值
        targetObj[keys] = source[keys];
      }
    } 
  }
  return targetObj;
}

es6的扩展运算符

var obj = {
  name: 'FungLeo',
  sex: 'man',
  old: '18'
}
var { ...obj2 } = obj
obj.old = '22'
console.log(obj)   ///{ name: 'FungLeo', sex: 'man', old: '22'}
console.log(obj2)  ///{ name: 'FungLeo', sex: 'man', old: '18'}
内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值