“戏说”js中的深浅拷贝

作者: 张一井 | 来源:发表于2019-07-19 16:28 被阅读5次

一、通俗解释,嘿嘿嘿

在做开发中,经常能遇到数组拷贝的操作。

初期我经常直接用“=”,但是发现,改副本的值,原始数组的值也随之变化了!!这导致了很多莫名的bug出现。最后一顿搜索骚操作,让我知道了深浅拷贝这回事。

“=”号这种形式,就是浅拷贝。

浅拷贝另一种意义上可以理解为只是同一个数组的别名。

比如,let 苏轼 = [],let 苏东坡; 苏东坡=苏轼。苏轼和苏东坡就是一个人,苏轼写了一首诗,苏东坡将诗给改了三百遍,最后还是苏轼的诗被改了。

深拷贝就是真正意义上的复制copy了,无论怎么改副本,原数组都不会变。

比如,苏轼的父亲是苏洵,属性都是从苏洵那里拷贝过来的。但是是两个人,苏洵有三百首诗,生了苏轼后,苏轼写了两百首,那这两百首是不会算到苏洵头上的。

二、正规解释。。。。。

扯了一番,咱们再从原理上看看,为什么会出现深浅拷贝这种奇异的东西。

因为是内存地址指向不同。

浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层。像字符串、数字就是一层数据,所以深浅拷贝都一样。

但对于所有形式的数组和对象,都要用深拷贝;

内存地址图解

这块涉及到堆栈知识,这里不做解释,可自己另做搜索。


//浅拷贝 
let a = new Object(); 
a.age=12;
let b= a; 
b.age=16;

上述代码内存地址指向是这样的

clipboard.png

所以深拷贝要做的就是给b做个新的堆内存地址。

三、你最关心的,到底怎么深拷贝

网上流传的有很多种

比如Object.assgin(), 数组的slice(),concat()、JSON.stringfy()、JSON.parse()等等,这些有的支持简单数据,有的检测不到undefined、function这种的。经测试不可行,以下是用过最保险版本,如果你有更好的方式欢迎留言~~~

四、上代码!!!!

let arr1 = [{c:1},{c:2,arr:[{c:1},{c:2},{c:3}]},{c:3},{c:4}]; 
deepCopy = function (obj) { 
var result = Array.isArray(obj) ? [] : {}; 
for (var key in obj) { 
  if (obj.hasOwnProperty(key)) { 
    if (typeof obj[key] === 'object' && obj[key]!==null) { 
        result[key] = this.deepCopy(obj[key]); //递归复制 
    } else {
       result[key] = obj[key];
   }
  }
} 
return result; 
}
 var arr2 = deepCopy(arr1); arr2[1].c = "9"; arr2[1].arr[1].c = "12"; 
console.log("数组的原始值:" , arr1 ); console.log("数组的新值:" , arr2 );

五、如果对你有帮助,关注,点赞,一条龙走起哈~~~

嘻嘻~~~
啦啦啦啦~~~

相关文章

  • “戏说”js中的深浅拷贝

    一、通俗解释,嘿嘿嘿 在做开发中,经常能遇到数组拷贝的操作。 初期我经常直接用“=”,但是发现,改副本的值,原始数...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • JS中的深浅拷贝

    这几乎是前端面试的高频问题。 什么是深浅拷贝? 浅拷贝 把对象a的值赋值给b,再修改b.name的值, a.nam...

  • JS文集的目录

    js基础心法 深浅拷贝(递归)深浅拷贝(首层浅拷贝) js 数据处理 数组对象查找的常见操作数组对象去重的常见操作...

  • js深浅拷贝

    项目中,一般会用loadsh库,地址:https://github.com/lodash/lodash 浅拷贝方法...

  • js 深浅拷贝

    浅拷贝 是 把对象或者数组的第一层 key 或者 索引 赋到 新的 对象或者对象上 深拷贝是迭代浅拷贝的操作,也就...

  • js 深浅拷贝

    深拷贝 更好的写法: 浅拷贝 浅拷贝,还可以用 Object.assign 、展开运算符 ...

  • JS深浅拷贝

  • JS深浅拷贝

    JS存储方式 JS中存在基本数据类型和引用数据类型1.基本数据类型:number,string,boolean,n...

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

网友评论

    本文标题:“戏说”js中的深浅拷贝

    本文链接:https://www.haomeiwen.com/subject/wfgavqtx.html