ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

js深拷贝浅拷贝

2022-06-24 19:34:16  阅读:139  来源: 互联网

标签:arr obj 数据类型 js result 拷贝 内存


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
 
</body>
<script>

// 在JS中,数据类型分为基本数据类型和引用数据类型两种,对于基本数据类型来说,它的值直接存储在栈内存中,
// 而对于引用类型来说,它在栈内存中仅仅存储了一个引用,而真正的数据存储在堆内存中

// 当基本类型实现浅拷贝,存在栈内存中,那么相互独立,互不影响。
// 当复杂类型实现浅拷贝,新对象与旧对象仍然同时指向堆内存的同一属性,互不独立,相互影响。

// 基本数据类型
var a = “1”;
var b = a;
a = 2;
console.log(b);

// 引用数据类型
var arr = [1,2,3];
var newArr = copy(arr); //[1,2,3]
newArr.push(4); //[1,2,3,4]
console.log(arr); //[1,2,3,4]
// 当我们创建arr数组时,arr被分配到了堆内存中,在栈内存留下可以寻找到的指针,
// 也就是说当我们创建新数组newArr时,赋予newArr的是arr在栈中的地址(指针),
// 其实仍与旧数组arr共享同一个内存,所以修改新数组newArr后,旧数组arr也会被修改

// 深拷贝
// 它可以将复杂类型的数据相互独立出来,互不影响
// 深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,
// 这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突

// 1、
function copy(obj) {
if(typeof obj == “object”) { //判断是否复杂类型
var result = obj.constructor == Array ? [] : {};//判断数组类型或是object,数组即result=[],object即result={}
for(let i in obj) {
result[i] = typeof obj[i] == “object” ? copy(obj[i]) : obj[i]//判断数据每一项是否是object
}
} else {
var result = obj //基本类型直接拷贝
}
return result;
}
// 2、
function deepClone(target) {
// 定义一个变量
let result;
// 如果当前需要深拷贝的是一个对象的话

 

更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/119997560

标签:arr,obj,数据类型,js,result,拷贝,内存
来源: https://www.cnblogs.com/wangchuanxinshi/p/16410014.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有