JavaScript数组及非数组对象的深浅克隆详解原理

 更新时间:2021年10月19日 16:06:02   作者:daixiangcn  
JavaScript中数组的方法种类众多,在ES3-ES7不同版本时期都有新方法;并且数组的方法还有原型方法和从object继承的方法,本文介绍了JavaScript数组及非数组对象的深浅克隆,希望读者能从中有所收获

什么是浅克隆、深克隆

浅克隆:直接将存储在栈中的值赋值给对应变量,如果是基本数据类型,则直接赋值对应的值,如果是引用类型,则赋值的是地址。
深克隆:将数据赋值给对应的变量,从而产生一个与源数据不相干的新数据(数据地址已变化)。即对象各个层级的属性。
JavaScript中基本数据类型使用符号“=”可以进行克隆,引用数据类型使用符号“=”只是改变了变量的指向,并没有进行真正的克隆操作。

1.对数组进行克隆

1.1 浅克隆

使用for循环进行浅克隆。

var arr1 = ['demo', 1, 2];
var arr2 = [];
// 数组的浅克隆
for (var i = 0; i < arr1.length; i++) {
    arr2[i] = arr1[i];
}
console.log(arr2);
console.log(arr1 == arr2);

输出结果:

Array(3)0: "demo"1: 12: 2length: 3[[Prototype]]: Array(0)
false

1.2 深克隆

使用递归进行深克隆。

function deepClone(o) {
	var result = [];
	for (var i = 0; i < o.length; i++) {
		result.push(deepClone(o[i]));
	}
	return result;
}

2.对非数组对象进行克隆

2.1 浅克隆

使用for循环进行浅克隆。

var obj1 = { a: 1, b: 2, c: 3, d: [4, 5, { e: 'demo' }] };
var obj2 = {};
// 对象的浅克隆
for (var i in obj1) {
    obj2[i] = obj1[i];
}
console.log(obj2);
console.log(obj1 == obj2);

输出结果:

{a: 1, b: 2, c: 3, d: Array(3)}
false

2.2 深克隆

使用递归进行深克隆。

function deepClone(o) {
	var result = {};
	for (var i in o) {
		result[i] = deepClone(o[i]);
	}
	return result;
}

3.整合深克隆函数

var obj1 = { a: 1, b: 2, c: 3, d: [4, 5, { e: 'demo' }] };
var arr1 = ['demo', 1, 2];
// 深克隆
function deepClone(o) {
    if (Array.isArray(o)) {
        // 是数组
        var result = [];
        for (var i = 0; i < o.length; i++) {
            result.push(deepClone(o[i]));
        }
    } else if (typeof o == 'object') {
        // 非数组,是对象
        var result = {};
        for (var i in o) {
            result[i] = deepClone(o[i]);
        }
    } else {
        // 基本类型值
        var result = o;
    }
    return result;
}
console.log(deepClone(arr1));
console.log(deepClone(obj1));

到此这篇关于JavaScript数组及非数组对象的深浅克隆详解原理的文章就介绍到这了,更多相关JavaScript 数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javascript Array.prototype.slice使用说明

    javascript Array.prototype.slice使用说明

    slice 可以用来获取数组片段,它返回新数组,不会修改原数组。
    2010-10-10
  • javascript断点调试心得分享

    javascript断点调试心得分享

    javascript中程序是怎么可以中断执行,然后一步一步走下去。而且debug的时候,可以看到变量,调用栈等东西。这个是如何实现的?
    2016-04-04
  • layer关闭当前窗口页面以及确认取消按钮的方法

    layer关闭当前窗口页面以及确认取消按钮的方法

    今天小编就为大家分享一篇layer关闭当前窗口页面以及确认取消按钮的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • JavaScript弹出对话框的三种方式

    JavaScript弹出对话框的三种方式

    本文主要介绍了javascript中的三种弹出对话框,分别是alert()方法,confirm()方法,prompt()方法,对javascript弹出对话框相关知识感兴趣的朋友一起学习吧
    2016-03-03
  • js实现右键弹出自定义菜单

    js实现右键弹出自定义菜单

    这篇文章主要为大家详细介绍了js实现右键弹出自定义菜单,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • 使用JS操作文件(FileReader读取--node的fs)

    使用JS操作文件(FileReader读取--node的fs)

    这篇文章主要介绍了使用JS操作文件(FileReader读取--node的fs),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • JavaScript判断是否为数字的几种方式汇总(推荐!)

    JavaScript判断是否为数字的几种方式汇总(推荐!)

    有时候需要根据输入的内容来进行计算,这个时候就需要判断输入的内容是否是数字,下面这篇文章主要给大家介绍了关于JavaScript判断是否为数字的几种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • JavaScript中的常见继承总结

    JavaScript中的常见继承总结

    这篇文章主要介绍了JavaScript中的常见继承总结,继承其实就是构造函数和构造函数之间的一种关系,更多相关介绍,需要的小伙伴可以参考下面文章内容
    2022-09-09
  • 分享5个JavaScript的写法小技巧

    分享5个JavaScript的写法小技巧

    写代码的时候总有一些东西是会重复出现的,次数多了你就会想找找捷径了,下面这篇文章主要给大家介绍了关于5个JavaScript的写法小技巧,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 拖动层效果,兼容IE和FF!

    拖动层效果,兼容IE和FF!

    拖动层效果,兼容IE和FF!...
    2006-11-11

最新评论