博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js中的深,浅克隆
阅读量:3961 次
发布时间:2019-05-24

本文共 1720 字,大约阅读时间需要 5 分钟。

js中的深,浅拷贝


浅拷贝

浅拷贝是指对于基本数据类型而言,复制它的值;对引用类型的数据仅能复制到它的地址,并不能对地址内存放的值进行复制。

浅拷贝效果显示:

浅拷贝方法:

function Clone(obj) {
if (Object.prototype.toString.call(obj) === "[object Object]") {
var newObj = {
}; for (var prop in obj) {
newObj[prop] = obj[prop]; } } return newObj; }

浅拷贝对象:

var obj = {
a: 4, b: [1, 2, 3] }

操作变量:

console.log(obj);        var Newobj = Clone(obj);        Newobj.b[2] = 5;        console.log(Newobj);

此处我们更改了 Newobj里的b属性的下标为2的值结果为:

在这里插入图片描述
可以明显发现,我们输出的原obj对象的b属性的下标为2的值也发生了改变,发生这种现象的原因就是浅拷贝的地址复制,我们在更改新对象 Newobj的b属性时此处b属性保存的地址和原obj对象的b属性的地址相同,因此改变会影响原对象。

深拷贝

深拷贝则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性

简单理解可理解:为把原对象逐层展开拷贝,将原对象里的引用类型也逐层拷贝,因此不再是单纯的地址复制,而是把保存的内容完全复制。因此改变新对象时不再影响原对象。

代码如下(示例):

function Clone(obj) {
if (Array.isArray(obj)) {
var arr = []; for (var i = 0; i < obj.length; i++) {
arr.push(Clone(obj[i])); } return arr; } else if (Object.prototype.toString.call(obj) === "[object Object]") {
var newObj = {
}; for (var prop in obj) {
newObj[prop] = Clone(obj[prop]); } return newObj; } else {
return obj; } } var obj = {
a: 4, b: [1, 2, 3] } console.log(obj); var Newobj = Clone(obj); Newobj.b[2] = 5; console.log(Newobj);

此函数主要思路为当遇到拷贝内容为引用类型时则自身再次调用(即为递归函数),因此拷贝过程会一直进行到所有引用类型数据完全复制为止

结果如图:
在这里插入图片描述

总结

本文为本人自身的理解,若有异议和建议可以评论或私信联系我,感谢观看。

转载地址:http://bwezi.baihongyu.com/

你可能感兴趣的文章
watir学习之—如何遍历页面所有的超链接
查看>>
ruby之——安装gem提示:Please update your PATH to include build tools or download the DevKit
查看>>
Selenium-Webdriver系列教程(一)————快速开始
查看>>
Selenium-Webdriver系列教程(2)———浏览器的简单操作
查看>>
Selenium-webdriver系列教程(3)———如何执行一段js脚本
查看>>
Selenium-webdriver系列教程(4)——如何定位测试元素
查看>>
Selenium-webdriver系列教程(5)———如何定位frame中的元素
查看>>
Selenium-webdriver系列教程(6)———如何捕获弹出窗口
查看>>
Eclipse(Windowns XP)下搭建Android开发环境——简介
查看>>
Android自动化工具Monkeyrunner使用(一)
查看>>
Android自动化工具Monkeyrunner使用(二)
查看>>
Android自动化工具Monkeyrunner使用(三)
查看>>
Android自动化工具Monkeyrunner使用(四)
查看>>
Android自动化工具Monkeyrunner使用(五)
查看>>
Selenium-webdriver系列教程(7)———如何处理alert和confirm
查看>>
Selenium-webdriver系列教程(8)———使用Page Object设计模式
查看>>
Python logging模块详解
查看>>
加载selenium2Library失败---robotframework环境搭建(RIDE无法启动?)
查看>>
Robot Framework 的安装配置和简单的实例介绍
查看>>
APP功能测试的7大注意点
查看>>