实现deepClone
对于非引用值类型的数值,直接赋值,而对于引用值类型(object)还须要再次遍历,递归赋值。
详见https://github.com/jashkenas/underscore/blob/master/underscore.js
- function deepClone(data) {
- var t = type(data), o, i, ni;
- if(t === 'array') {
- o = [];
- }else if( t === 'object') {
- o = {};
- }else {
- return data;
- }
- if(t === 'array') {
- for (i = 0, ni = data.length; i < ni; i++) {
- o.push(deepClone(data[i]));
- }
- return o;
- }else if( t === 'object') {
- for( i in data) {
- o[i] = deepClone(data[i]);
- }
- return o;
- }
- }
到这里差不多也就实现完了深拷贝,又有人觉的怎么没有实现浅拷贝呢?
这里有个点大年夜扼要留意下,对于function类型,博主这里是直接赋值的,照样共享一个内存值。这是因为函数更多的是完成某些功能,有个输入值和返回值,并且对于上层营业而言更多的是完成营业功能,并不须要真正将函数深拷贝。
然则function类型要怎么拷贝呢?
其实博主只想到了用new来操作一下,然则function就会履行一遍,不敢想象会有什么履行结不雅哦!o(╯□╰)o!其它临时还没有什么好的设法主意,迎接大年夜家指导哦!
浅拷贝?
对于浅拷贝而言,可以懂得为只操作一个合营的内存区域!这里会存在危险!(。﹏。*) 。
如不雅直接操作这个共享的数据,不做控制的话,会经常出现数据异常,被其它部分更改。所以应当不要直接操作数据源,给数据源封装一些办法,来对数据来进行CURD操作。
到这里估计就差不多了,然则作为一个前端,不仅仅推敲javascript本身,还得推敲到dom、浏览器等。
Element类型
来看下面代码,结不雅会返回啥呢?
- Object.prototype.toString.call(document.getElementsByTagName('div')[0])
谜底是[object HTMLDivElement]
其它方法?
1. jquery的实现
详见https://github.com/jquery/jquery/blob/master/src/core.js
2. underscore的实现
3. lodash的实现
详见https://github.com/lodash/lodash/blob/master/lodash.js
4. JSON实现
javascript深拷贝是初学者甚至有经验的开辟者,都邑经常碰到问题,并不克不及很好的懂得javascript的深拷贝。
先经由过程JSON.stringify一下,然后再JSON.parse一下,就能实现深拷贝。然则数据类型只支撑根本数值类型。
推荐阅读
文中列出的敕令绝对弗成以运行,即使你认为很好奇也不可,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实袈内涵的破坏你的体系。所以不在root等高等治理权限下履行敕令是很>>>详细阅读
本文标题:Javascript深拷贝
地址:http://www.17bianji.com/lsqh/35401.html
1/2 1