js深拷贝和浅拷贝魔艺极速js出现广告怎么办

在使用JavaScript对数组进行操作的时候峩们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量那么我们只要更改其中的任何一个,然后其他的也会跟着改變这就导致了问题的发生。

像上面的这种直接赋值的方式就是浅js深拷贝和浅拷贝很多时候,这样并不是我们想要得到的结果其实我們想要的是arr的值不变,不是吗

返回一个数组的一段。(仍为数组) 必选项一个 Array 对象。 必选项arrayObj 中所指定的部分的开始元素是从零开始計算的下标。 可选项arrayObj 中所指定的部分的结束元素是从零开始计算的下标。 slice 方法一直复制到 end 所指定的元素但是不包括该元素。如果 start 为负将它作为 length + start处理,此处 length 为数组的长度如果

concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组而仅仅会返回被连接数组的一个副本。
返回一个新的数组该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组那么添加的是数组中的元素,而不昰数组

就是把对象的属性遍历一遍,赋给一个新的对象

}

这个月太忙了一直没时间更新博客。帮楼下房友用react写系统react终于应用于实际项目了。房友前端技术栈是react+dva+antd+nodejs+webpack这些后面有时间具体总结。今天写一下js的深js深拷贝和浅拷贝和淺js深拷贝和浅拷贝这个名词经常听到,但是可能有的同学不是很明白他们的意思今天就用浅显易懂的语言和大家介绍一下!

浅js深拷贝囷浅拷贝其实我之前有文章具体讲过,不过没有提及这个名词罢了例如:,这篇文章里面讲到如下:

// 这时m.a的值是多少

m.a会输出15,因为这昰浅js深拷贝和浅拷贝n和m指向的是同一个堆,对象复制只是复制的对象的引用

深js深拷贝和浅拷贝和上面浅js深拷贝和浅拷贝不同,就是彻底copy一个对象而不是copy对象的引用,例如还是之前的例子,我们这么写:

这次我们再来输出m.a ,发现m.a的值还是10,并没有改变m对象和n对象是雖然所有的值都是一样的,但是在堆里面对应的不是同一个了,这个就是深js深拷贝和浅拷贝

深js深拷贝和浅拷贝和浅js深拷贝和浅拷贝的礻意图大致如下:

浅js深拷贝和浅拷贝只复制指向某个对象的指针,而不复制对象本身新旧对象还是共享同一块内存。但深js深拷贝和浅拷貝会另外创造一个一模一样的对象新对象跟原对象不共享内存,修改新对象不会改到原对象

1、可以通过简单的赋值实现

类似上面的例孓,当然我们也可以封装一个简单的函数,如下:

Object.assign() 方法可以把任意多个的源对象自身的可枚举属性js深拷贝和浅拷贝给目标对象然后返囙目标对象。但是 Object.assign() 进行的是浅js深拷贝和浅拷贝js深拷贝和浅拷贝的是对象的属性的引用,而不是对象本身

注意:当object只有一层的时候,是罙js深拷贝和浅拷贝例如如下:

1、方法一还是手动复制

和上面的举例一样,手动复制可以实现深js深拷贝和浅拷贝

2、对象只有一层的话可鉯使用上面的:Object.assign()函数

这个性能还不错,使用起来也很简单

上面就是对js深js深拷贝和浅拷贝和浅js深拷贝和浅拷贝的总结,其中部分参考了一些文章 例如

}
  • 第一类,业务需要,急需知道如何深js罙拷贝和浅拷贝JS对象的开发者
  • 第二类,希望扎实JS基础,将来好去面试官前秀操作的好学者。
你只需要一行黑科技代码就可以实现深js深拷贝和淺拷贝
别着急走,利用window.JSON的方法做深js深拷贝和浅拷贝存在2个缺点:
  • 如果你的对象里有函数,函数无法被js深拷贝和浅拷贝下来
  • 无法js深拷贝和浅拷贝copyObj对潒原型链上的属性和方法

当然,你明确知道他们的缺点后,如果他的缺点对你的业务需求没有影响,就可以放心使用了,一行原生代码就能搞定

目前我在开发业务场景中,大多还真可以忽略上面2个缺点。往往需要深js深拷贝和浅拷贝的对象里没有函数,也不需要js深拷贝和浅拷贝它原型链嘚属性

下面我会尽可能全面的讲解清楚JS里对象的js深拷贝和浅拷贝,要讲清楚js深拷贝和浅拷贝,你需要一点点前置知识

  • 理解JS里的引用类型和值類型的区别,知道Obj存储的只是引用
  • 1.深js深拷贝和浅拷贝、浅js深拷贝和浅拷贝是什么
  • 2.深js深拷贝和浅拷贝、浅js深拷贝和浅拷贝在业务里的最常见的應用场景
  • 3.深js深拷贝和浅拷贝和浅js深拷贝和浅拷贝的实现方式

1.深js深拷贝和浅拷贝、浅js深拷贝和浅拷贝是什么

我们讨论JS对象深js深拷贝和浅拷贝、浅js深拷贝和浅拷贝的前提

只有对象里嵌套对象的情况下,才会根据需求讨论,我们要深js深拷贝和浅拷贝还是浅js深拷贝和浅拷贝。

因为,如果是類似这样{name: 'ziwei'},没有嵌套对象的对象的话,就没必要区分深浅js深拷贝和浅拷贝了只有在有嵌套的对象时,深js深拷贝和浅拷贝和浅js深拷贝和浅拷贝才囿区别

浅js深拷贝和浅拷贝是什么样子的 (我们暂时不管具体如何实现,因为下面会单讲)

所以, 2个obj经过js深拷贝和浅拷贝后,虽然他们属性相同,也的确昰不同的对象,但他们内部的obj都是指向同一个内存空间,这种我们叫浅js深拷贝和浅拷贝

深js深拷贝和浅拷贝是什么样子的 (我们暂时不管具体如何實现,因为下面会单讲)

2个obj2除了js深拷贝和浅拷贝了一样的属性,没有任何其他关联。

所以, 2个obj经过js深拷贝和浅拷贝后,除了js深拷贝和浅拷贝下来相同嘚属性之外,没有任何其他关联的2个对象,这种我们叫深js深拷贝和浅拷贝

2.深js深拷贝和浅拷贝在业务里的最常见的应用场景

举个栗子,业务需求是 : ┅个表格展示商品各种信息,点击【同意】时,是可以弹出对话框调整商品数量的

这种业务需求下,我们就会用到对象的深js深拷贝和浅拷贝。洇为【商品表格】的属性和【调整商品表格】的属性几乎一样,我们需要js深拷贝和浅拷贝

下面的伪代码和图片就是展示使用浅js深拷贝和浅拷贝存在的问题

这样得到的adjustTableArr和tableArr里,内部对象都是相同的,所以就出现了图中红线标注的情况,

当我们修改【调整商品表格】里的商品数量时,【商品表格】也跟着改变了,这并不是我们想要的


// 表格对象的数据结构
 

而实际上,我们希望这2个表格里的数据完全独立,互不干扰,只有在确认调整之後才刷新商品数量。

这种情况下我们就可以使用前面说的深js深拷贝和浅拷贝的一行黑科技

还记得它的缺陷吗? 对象里的函数无法被js深拷贝和淺拷贝,原型链里的属性无法被js深拷贝和浅拷贝这里就对业务没有影响,可以很方便的深js深拷贝和浅拷贝。

3.深js深拷贝和浅拷贝和浅js深拷贝和淺拷贝的实现方式

其实JQ里已经有$.extend()函数,实现就是深js深拷贝和浅拷贝和浅js深拷贝和浅拷贝的功能有兴趣的小伙伴也可以看看源码。

浅js深拷贝囷浅拷贝比较简单,就是用for in 循环赋值

  • 深js深拷贝和浅拷贝,就是遍历那个被js深拷贝和浅拷贝的对象
  • 判断对象里每一项的数据类型
  • 如果不是对象类型,就直接赋值,如果是对象类型,就再次调用deepCopy,递归的去赋值

以上的无论深、浅js深拷贝和浅拷贝,都用了source.hasOwnProperty(key),意思是判断这一项是否是其自有属性,是嘚话才js深拷贝和浅拷贝,不是就不js深拷贝和浅拷贝。

也就是说__proto__上面的属性,我不js深拷贝和浅拷贝这个其实你可以根据业务需求,来决定加上和這个条件

虽然大家可能经常用框架提供的api来实现深js深拷贝和浅拷贝。

这篇文章分享的目的,更多还是希望用一篇文章整理清楚深浅js深拷贝和淺拷贝的含义、递归实现思路,以及小伙伴们如果使用了JSON.parse()这种黑科技,一定要清楚这样写的优缺点

上面的deepCopy方法有漏洞,没有考虑source一开始就是數组的情况

}

我要回帖

更多关于 js深拷贝 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信