首页 > 其他分享 >深浅拷贝的区别和实现

深浅拷贝的区别和实现

时间:2023-12-19 11:33:08浏览次数:41  
标签:obj key 区别 对象 深浅 数组 var 拷贝

数组的浅拷贝:
如果是数组,我们可以利用数组的一些方法,比如 slice,concat 方法返回一个新数组的特性来实
现拷贝,但假如数组嵌套了对象或者数组的话,使用 concat 方法克隆并不完整,如果数组元素是
基本类型,就会拷贝一份,互不影响,而如果是对象或数组,就会只拷贝对象和数组的引用,这样
我们无论在新旧数组进行了修改,两者都会发生变化,我们把这种复制引用的拷贝方法称为浅拷
贝,
深拷贝就是指完全的拷贝一个对象,即使嵌套了对象,两者也互相分离,修改一个对象的属性,不
会影响另一个如何深拷贝一个数组1、这里介绍一个技巧,不仅适用于数组还适用于对象!那就
是:
var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]
var new_arr = JSON.parse( JSON.stringify(arr) );     console.log(new_arr);
原理是 JOSN 对象中的 stringify 可以把一个 js 对象序列化为一个 JSON 字符串,parse 可以把
JSON 字符串反序列化为一个 js 对象,通过这两个方法,也可以实现对象的深复制。但是这个方法
不能够拷贝函数。
浅拷贝的实现:
以上三个方法 concat,slice ,JSON.stringify 都是技巧类,根据实际项目情况选择使用,我们可以思
考下如何实现一个对象或数组的浅拷贝,遍历对象,然后把属性和属性值都放在一个新的对象里即

var shallowCopy = function(obj) {
// 只拷贝对象
if (typeof obj !== 'object') return;
// 根据 obj 的类型判断是新建一个数组还是对象
var newObj = obj instanceof Array ? [] : {};
// 遍历 obj,并且判断是 obj 的属性才拷贝
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = obj[key];
}
}
return newObj;
深拷贝的实现
那如何实现一个深拷贝呢?说起来也好简单,我们在拷贝的时候判断一下属性值的类型,如果是对
象,我们递归调用深拷贝函数不就好了
var deepCopy = function(obj) {
if (typeof obj !== 'object') return;
var newObj = obj instanceof Array ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = typeof obj[key] === 'objec
t' ? deepCopy(obj[key]) : obj[key];
}
}
return newObj;
}

标签:obj,key,区别,对象,深浅,数组,var,拷贝
From: https://www.cnblogs.com/xhu218/p/17913302.html

相关文章

  • 金融行业CRM和普通CRM有什么区别?金融CRM功能解析
    市场形式波诡云谲,金融行业也面临着资源体系分散、竞争力后继不足、未知风险无法规避等问题。金融企业该如何解决这些问题,或许可以了解一下CRM管理系统,和其提供的金融行业CRM解决方案。金融行业是银行业、保险业、信托业、证券业和租赁业的总称,有客户数量大、资金管理复杂、员工工......
  • JavaScript 中 let、var 和 const 的区别及使用建议
    前言JavaScript中的let、var和const是三种不同的变量声明方式。虽然它们都可以用来声明变量,但它们之间有很大的区别。在本篇文章中,我们将深入探讨这三种变量声明方式的区别以及它们在实际开发中的应用。正文内容一、let的用法let是ES6中新增的变量声明方式,它的作用域......
  • PyCharm中New Directory 和 New Python Package的区别
    如题,这是一个很简单也很基础的问题,先看不同操作的结果有什么不同结果1:项目下出现了一个空“文件夹” 结果2:项目下多了一个“PythonPackage”,该package下包含了一个“__init__.py”文件,该py文件是空的如果把该py文件删掉后,package也就变成了directory  所以什么是__in......
  • js Cookie、sessionStorage、localStorage 的区别
    fetch发送2次请求的原因参考回答:fetch发送post请求的时候,总是发送2次,第一次状态码是204,第二次才成功?原因很简单,因为你用fetch的post请求的时候,导致fetch第一次发送了一个Options请求,询问服务器是否支持修改的请求头,如果服务器支持,则在第二次中发送真正的请求......
  • 电工——保护接零、保护接地、工作接地、重复接地的区别
     TT系统左边Rb位置是中性接地(保护零线),也是工作接地右边Ra位置是用电器保护接地,也是外壳接地,为了在线绝缘皮破损时防止壳体带电 TN-C系统Rb位置工作接地N是工作零线PE是保护零线PEN就是二合一,不管是接地还是当零线都可以如果断路,直接电流直接通过PEN线,触发保护装置,蓝......
  • 视频格式50p,50i ,25p的区别
    拍视频的初学者,打开机器拍摄设置,看到视频格式里有很多选项,像1920*1080/1280*720等还比较好理解,就是高清和小高清的区别,现在视频的要求,最基本也需要高清即选1920*1080。但这个参数后面还有很多的数字选项,常见的有59.94p,59.94i,50p,50i,29.97p,25p,24p等,不知道如何选择。现笔者给大......
  • Nginx中alias和root的区别
    location/i{#www.a.com/i/123.gif alias/var/www/html/images/;#/var/www/html/images/123.gif}在这个location段配置中,如果url请求/i/logo.gif,那么Nginx将会在服务器上查找/var/www/html/images/logo.gif文件,也就是说请求的url中location后面的部分会被追加到ali......
  • Java工具库中字符串判空方法知多少?各有什么区别?
    SpringFramework库在SpringBoot项目中,通常情况下,你不需要额外引入依赖来使用SpringFramework库中的常用工具方法,这是因为SpringBoot的起步依赖已经包含了SpringFramework的核心库,其中包括org.springframework.util包。这个用起来就很方便。在这里面有两个常用的方法:StringUtil......
  • C++(虚函数和纯虚函数的区别)
    在C++中,虚函数和纯虚函数都与面向对象编程中的多态性相关,但它们有一些关键的区别。虚函数(VirtualFunction):定义:虚函数是在基类中声明并在派生类中定义的函数,使用virtual关键字进行声明。在基类中可以提供一个默认实现,但在派生类中可以选择覆盖(override)它。实现:虚函数可......
  • on,in,at三者之间的用法和区别
    表示事件时的用法区别:in时间长;on某-点;at时间短。表示地点时的用法区别:at强调点;on强调面;in强调在里面。表示方位时的用法区别:介系词in表示的方位是在某事物的内部,占去某物一部分。 第一,介词in,on,at表示时间时的用法区别:1,in时间范围大(一天以上)泛指在上......