目录

1.浅克隆(浅拷贝)

2.深克隆(深拷贝)

总结


1.浅克隆(浅拷贝)

无法进行引用类型(地址和地址中数据的)双重拷贝,从而导致克隆者和被克隆者指向同一地址后,任何一方发生数据的改变都会影响对方的数据。

克隆者与被克隆者之间相互影响。

var arr = [{a: 1,b: [1, 2, 3]}, 2, 3, 4];function clone(param) {if (Array.isArray(param)) {//  判断是不是数组var newArr = [];for (var i = 0; i < param.length; i++) {newArr.push(param[i]);};return newArr;} else if (Object.prototype.toString.call(param) === '[object Object]') {//  判断是不是对象var newObj = {};for (var k in param) {newObj[k] = param[k];};return newObj;} else {//  函数 与 基本数据类型 可以直接返回//  函数就是为了被调用:不需要所谓的克隆,需要函数内部的数据时执行调用就好。//  基本数据类型可实现数据的完全拷贝return param;};};var clonedRes = clone(arr);console.log(clonedRes);

输出结果如下图:

看起来,clonedRes和arr的确一模一样。

接下来,看看改变clonedRes中的数据时会发生什么吧?

clonedRes[0].a = 8;

console.log(arr);

结果如下:

可见:改变clonedRes中的数据,也会引发arr中数据的改变。

这就是浅拷贝的不足之处了,所以才有了深拷贝的存在。


2.深克隆(深拷贝)

克隆地址和数据,直到克隆到引用类型的最深层(存储的都是基本数据类型)时,形成绝对的结构拷贝,使拷贝者拥有完全一样的独立结构和独立数据,从而实现深克隆。

克隆者与被克隆者之间互不影响。

var arr = [{ a: 1, b: [1, 2, 3], }, 2, 3, 4];function clone(param) {// 通过条件限制来进行不同类型数据的克隆if (Array.isArray(param)) {//  判断是不是数组var newArr = [];for (var i = 0; i < param.length; i++) {//  利用递归 对数组类型进行浅拷贝后,再调用clone进行一次浅拷贝,从而实现深拷贝newArr.push(clone(param[i]));};return newArr;} else if (Object.prototype.toString.call(param) === '[object Object]') {//  判断是不是对象var newObj = {};//  遍历对象 for infor (var k in param) {//  利用递归 对对象类型进行浅拷贝后,再调用clone进行一次浅拷贝,从而实现深拷贝newObj[k] = clone(param[k]);};return newObj;} else {//  函数 与 基本数据类型 可以直接返回//  函数就是为了被调用:不需要所谓的克隆,需要函数内部的数据时执行调用就好。//  基本数据类型可实现数据的完全拷贝return param;};};var clonedRes = clone(arr);

结果如图:

仍测试改变clonedRes中的数据时,arr是否改变?

clonedRes[0].a = 8;

console.log(arr);

已经完成深拷贝了,当然不会改变了。

其实,完成深拷贝后,克隆者和被克隆者就像是一对双胞胎,看起来一模一样,但实际上就是两个独立的个体。

当独立的个体各自做自己独立的事情时,当然不会影响对方啦~


总结

学习深浅克隆,更深的感受到了不同数据类型之间的细微差别。

所以,按实际情况实现相应功能总是不会错的。

js之深浅克隆(深浅拷贝)相关推荐

  1. JS 中对象的深浅拷贝(ES3、ES5、ES6不同方法底层实现,一文搞清楚深浅拷贝面试常问题)

    JS 中对象的深浅拷贝   拷贝我们都知道这个词的意思,我们经常做过复制.粘贴的操作,其中的复制就是拷贝,那么在拷贝的时候,如果我们复制出来的内容和原内容是完全的分开,各自不相影响,那么这就属于深拷贝 ...

  2. 前端面试题 HTML5 CSS3(盒子模型、盒子水平垂直居中、经典布局) JS(闭包、深浅克隆、数据劫持和拦截) 算法(排序、去重、数组扁平化) Vue(双向数据绑定原理、通信方式)

    前端面试题 HTML5 相关面试题 CSS3 相关面试题 盒子模型 盒子水平垂直居中的方案 经典布局方案 圣杯布局 双飞翼布局 flex布局 定位方式布局 css实现三角形 JS 相关面试题 8种数据 ...

  3. Java深浅克隆原理及实现

    1.深浅克隆定义 Java 中的数据类型分为基本数据类型和引用数据类型.对于这两种数据类型,在进行赋值操作.用作方法参数或返回值时,会有值传递和引用(地址)传递的差别. (补充)基本数据类型包括byt ...

  4. js中的深浅复制(深浅拷贝、深浅克隆)

    什么是浅复制? --把一个变量赋值给另一个变量,基本数据类型如数字,字符串,布尔值等这些是拷贝值,引用数 据类型如对象,数组,函数等,这些拷贝的是地址. 深复制: 将一个对象从内存中完整的拷贝一份出来 ...

  5. 前端面试JS必备基础之深浅拷贝和this指向问题@莫成尘

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

  6. js动态创建对象_JS深浅拷贝的深入浅出

    一 首先了解JavaScript中的基本数据类型 基本数据类型:String,Number,Boolean,Null,Undefined 引用数据类型:Araay,Date,RegExp,Functi ...

  7. java中的深浅克隆

    假设有一个对象object,在某处又需要一个跟object一样的实例object2,强调的是object和object2是两个独立的实例,只是在开始的时候,他们是具有相同状态的(属性字段的值都相同). ...

  8. 深浅克隆面试题汇总——附详细答案

    在开始学习深克隆和浅克隆之前,我们先来看下面代码,有什么问题? class CloneTest {public static void main(String[] args) throws Clone ...

  9. JavaScript中的经典题型(类数组、CSS Sprites、事件委托、经典去重、原型链、闭包、深浅克隆、附带思路流程和源码)

    JavaScript中的经典题型 一.JavaScript中的经典题型 1..如何判断一个数组和类数组? 首先要明白什么是类数组. 类数组:类数组是一个普通对象,他的原型是Object.而真实的数组是 ...

最新文章

  1. js 转义成html,js转义html,反转义
  2. 八数码问题——双向广度优先搜索解决
  3. 运营商竞速搭建手机支出公司
  4. 【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩
  5. 算法动画 - 理解函数曲线
  6. C语言程序的错误和警告
  7. spring security 2.x HttpSessionEventPublisher 以及listener配置
  8. Flutter实战一Flutter聊天应用(八)
  9. fft python 举例_Python FFT合成波形的实例
  10. java duration 时间差_java8 计算时间差的方法示例
  11. iOS 使用pods报错问题 pod --version
  12. python下载安装教程-Python下载并安装图形教程[超级详细]
  13. Arduino - 连接RS232串口设备(通过RS232转TTL转接口)
  14. 进化算法之粒子群算法介绍附代码——PSO
  15. 软件安全(开发模型、需求分析、测试)总结
  16. #英语# 表示人的名词后缀论文文献
  17. 图的点,边和度之间的关系
  18. 电商如何抢占“双十一”?试试自动化仓库机器人 | 行业
  19. win11在计算机管理中添加用户发现没有本地用户和组,命令方式添加用户以及查看用户
  20. 面:【1】笔试. mgj 再菜也能做出来,,,有点信心好不好

热门文章

  1. ONVIF网络摄像头(IPC)客户端开发—ONVIF介绍
  2. 拓嘉启远:怎样才能避免拼多多网店被限制
  3. OMNI USDT 0.11.0 环境部署
  4. python编写一个判断完数的函数过程_1.编写一个函数判断一个整数是否是完数(一个数如果恰好等于他的因子之和,这个数就称为完数,如6=1+2+3)...
  5. Emlog评论区显示用户操作系统与浏览器信息教程
  6. 【博弈SG】HDOJ1846
  7. HDU - 1846 Brave Game
  8. 埃隆马斯克又开始卖板砖了?
  9. HTML+CSS+JavaScript制作520七夕情人节代码(烟花表白)
  10. 使用ButterKnife时的编译报错解决