博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js对象的深浅拷贝
阅读量:5973 次
发布时间:2019-06-19

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

js对象的深浅拷贝

针对于JavaScript的对象和数组(数组也是对象)浅拷贝只是引用,内存不变;而深拷贝就是递归赋值。

深拷贝是不同内存,相互独立。而浅拷贝会影响

//1.循环复制数组var arr = [1,2,3],arr2 = [];for(var i=0;i

别急着走,利用window.JSON的方法做深拷贝存在2个 缺点:

  • 如果你的对象里有函数,函数无法被拷贝下来
  • 无法拷贝对象原型链上的属性和方法

例如下面这种情况:对象里包含函数

var o1 = {    name:"小明",    age:12,    city:"广州",    schools:["小学","中学","大学"],    say:function(){            alert(this.name);    }}

for...in 遍历对象,找出自身的属性,且会搜索原型,即也会查找原型上的属性

__proto__不可枚举的属性

obj.hasOwnProperty() 返回布尔值 判断属性是否是自有属性

JSON.parse(JSON.stringify(o1)) 可以将只有属性/不存在方法的对象复制

JSON.stringify 将对象转换成字符串,转换的过程,会忽略掉方法.

//下面的方法可以实现 深深度复制(复制包括函数)

function deepClone(oldObj){        var newObj = {};        for(var key in oldObj){                if(oldObj.hasOwnProperty(key)){                        if(oldObj[key].constructor == Array){ //判断oldObj[key]值是否数组/对象                                newObj[key] = oldObj[key].slice();                        }else if(oldObj[key].constructor == Object){                                newObj[key] == deepClone(oldObj[key]);                        }else{                                newObj[key] = oldObj[key];                        }                }        }        return newObj;}var o2 = deepClone(o1);

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

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


图片描述


js堆栈

由于js中的对象都是复杂数据类型,这种数据在内存中存储的时候,存放在堆中。当简单赋值的时候,其实是将该对象的指针指向同一个堆地址。

简单的数据类型存放在栈中,当对简单的数据类型进行赋值的时候,其实就是直接在栈中新开辟一个地方专门存储一样的值。

数据结构里的堆栈:

栈(stack): 由编译器自动分配, 存放函数的参数值, 局部变量的值等. 其操作方式类似于数据结构中的栈.
堆(heap): 一般由程序员分配释放, 若程序员不释放, 程序结束时可能由OS回收. 这里OS是指: 操作系统(Operating System)

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

你可能感兴趣的文章
博客点滴从此开始----------纪念我的2012暑假生活
查看>>
我的友情链接
查看>>
Linux软RAID操作与实现学习笔记
查看>>
为Angularjs ngOptions加上index解决方案
查看>>
hive启动问题 Unable to start Hive Cli
查看>>
虚拟化系列-Windows server 2012 网络管理
查看>>
gridview 获取当前行的index ,按钮的click事件
查看>>
Linux常用命令
查看>>
vmstat命令的含义
查看>>
无线自主AP漫游
查看>>
【翻译】在Ext JS应用程序中构建可维护的控制器
查看>>
C#开发学习——SqlHelper的应用
查看>>
第四周作业
查看>>
Chem 3D中怎么创建立体模型
查看>>
5月8号打卡
查看>>
[转]各种排序算法的分析及java实现
查看>>
用扩展开发一个PHP类
查看>>
How Delete File with Readonly Permission?
查看>>
[MSSQL2005]再看CTE
查看>>
Ubuntu安装Fcitx(小企鹅五笔输入法)
查看>>