JS中的浅拷贝手段

ops/2024/10/11 4:34:58/

1.slice方法

let arr = [1,2,3]
let newArr = arr.slice();
newArr[0] = 100;
console.log(arr);//[1,2,3]

当修改newArr的时候,arr的值并不改变,什么原因?因为这里newArr是arr浅拷贝后的结果,newArr和arr现在引用的已经不是同一块空间啦。

这就是浅拷贝!

但是浅拷贝还有潜在的问题:

let arr = [1,2,{val:4}];
let newArr = arr.slice();
newArr[2].val = 1000;
console.log(arr);//[1,2,{val:1000}]

不是已经不是同一块空间的引用了吗?为什么改变了newArr改变了第二个元素的val值,arr也跟着变了。
这就是浅拷贝的限制所在了,它只能拷贝一层对象,如果有对象的嵌套,那么浅拷贝将无能为力,但幸运的是,深拷贝就是为了解决这个问题而生的,它能解决无限极的对象嵌套问题,实现彻底的拷贝

2.手动实现浅拷贝

const shallowClone = target=>{if(typeof target==='object'&&target!==null){const cloneTarget = Array.isArray(target)?[]:{};for(let prop in target){if(target.hasOwnProperty(prop)){cloneTarget[prop] = target[prop];}}return cloneTarget;}else{return target;}
}

3.Object.assign

Object.assign()拷贝的是对象属性的引用,而不是对象本身。

let obj = {name:'sy',age:18};
const obj2 = Object.assign({},obj,{name:'sss'});
console.log(obj2);//{name:'sss',age:18}

4.concat浅拷贝数组

let arr = [1,2,3];
let newArr = arr.concat();
newArr[1] = 100;
console.log(arr);//[1,2,3]

5.展开运算符

let arr = [1,2,3]
let newArr = [...arr];//跟arr.slice()是一样的效果

http://www.ppmy.cn/ops/123807.html

相关文章

ElementUI 2.x 输入框回车后在调用接口进行远程搜索功能

输入框回车后在调用接口进行远程搜索功能 主要思路 默认的远程搜索会在输入框聚焦的时候就展示下拉弹窗&#xff0c;而我们需要的是在回车之后才展示下拉弹窗。 具体代码 <divv-for"(domain, index) in formData.domains"class"dynamic-input":key&…

设计模式-备忘录模式

备忘录&#xff08;Memento&#xff09;模式&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在改对象之外这个状态&#xff0c;从而可以在以后将该对象恢复到原先保存的状态。 就是实现的思路&#xff1a;就是可变化的类中关联中 备忘录对…

【Vue】vue-admin-template项目搭建

准备 node环境 node&#xff1a;v16.12.0npm&#xff1a;8.1.0 vue-element-admin下载 官网&#xff1a;https://panjiachen.github.io/vue-element-admin-site/guide/ 我这边下载的是4.4.0版本的&#xff0c;使用其他版本可能会因为所需要的node和npm版本过低或过高导致异常…

vue2项目的路由使用history模式,刷新会导致页面404的问题

在vue2项目中&#xff0c;如果我们使用的路由是history模式&#xff0c;刷新会导致页面404&#xff0c;解决方法很简单&#xff0c;在vue.config.js文件中的devServer下增加historyApiFallback: true; 代码如下: module.exports {devServer: {historyApiFallback: true,} }

protobuf之Message

简介 Message是protobuf的消息抽象类&#xff0c;是其它通过protoc生成的自定义消息的基类 结构 #mermaid-svg-u5iAZNpfIH5hQrlP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u5iAZNpfIH5hQrlP .error-icon{fil…

初始项目托管到gitee教程,开箱即用

0.本地仓库与远程仓库关联&#xff08;需先在gitee创建仓库&#xff09; ①打开powershell生成ssh key ssh-keygen -t ed25519 -C "Gitee SSH Key"-t key 类型-C 注释 生成成功如下&#xff0c;并按下三次回车 ②查看公私钥文件 ls ~/.ssh/输出&#xff1a; id_…

128陷阱源码级分析

一、引言 在Java编程中&#xff0c;128陷阱是一个与操作符和equals()方法有关的常见问题&#xff0c;特别是在比较Integer对象时。这个陷阱涉及到Java的自动装箱&#xff08;Autoboxing&#xff09;和整数缓存机制&#xff08;Integer Cache&#xff09;。本文将详细分析128陷…

yolov5-7.0模型DNN加载函数及参数详解(重要)

yolov5-7.0模型DNN加载函数及参数详解&#xff08;重要&#xff09; 引言yolov5&#xff08;v7.0&#xff09;1&#xff0c;yolov5.h(加载对应模型里面的相关参数要更改)2&#xff0c;main主程序&#xff08;1&#xff09;加载网络&#xff08;2&#xff09;检测推理&#xff0…