当前位置: 首页 > news >正文

做折页的网站/优化网站关键词

做折页的网站,优化网站关键词,wordpress邮箱如何解析,页面设计原型图是什么为啥要用深拷贝? 在很多情况下,我们都需要给变量赋值,给内存地址赋值,但是在赋引用类型值的时候,只是共享同一个内存区域,导致赋值的时候,还跟之前的值保持一致性。 看一个具体的例子 // 给t…

为啥要用深拷贝?

在很多情况下,我们都需要给变量赋值,给内存地址赋值,但是在赋引用类型值的时候,只是共享同一个内存区域,导致赋值的时候,还跟之前的值保持一致性。

看一个具体的例子

// 给test赋值了一个对象
var test = {a: 'a',b: 'b'
};// 将test赋值给test2
// 此时test和test2是共享了同一块内存对象,这也就是浅拷贝
var test2 = test;test2.a = 'a2';test.a === 'a2'// 为true

图解:
这里写图片描述

这下就很好理解为什么引用值类型数据相互影响问题。

实现

实现一个深拷贝函数,就不得不说javascript的数值类型。

判断javascript类型

javascript中有以下基本类型

类型描述
undefinedundefined类型只有一个值undefined,它是变量未被赋值时的值
nullnull类型也只有一个值null, 它是一个空的对象引用
BooleanBoolean有两种取值true和false
String它表示文本信息
Number它表示数字信息
Object它是一系列属性的无序集合, 包括函数Function和数组Array


使用typeof是无法判断function和array的,这里使用Object.prototype.toString方法。 默认情况下,每个对象都会从Object上继承到toString()方法,如果这个方法没有被这个对象自身或者更接近的上层原型上的同名方法覆盖(遮蔽),则调用该对象的toString()方法时会返回”[object type]”,这里的字符串type表示了一个对象类型

function type(obj) {
var toString = Object.prototype.toString;
var map = {'[object Boolean]'  : 'boolean','[object Number]'   : 'number','[object String]'   : 'string','[object Function]' : 'function','[object Array]'    : 'array','[object Date]'     : 'date','[object RegExp]'   : 'regExp','[object Undefined]': 'undefined','[object Null]'     : 'null','[object Object]'   : 'object'
};
return map[toString.call(obj)];
}

实现deepClone

对于非引用值类型的数值,直接赋值,而对于引用值类型(object)还需要再次遍历,递归赋值。
简洁版的深拷贝

function clone(Obj) {var buf;   if (Obj instanceof Array) {buf = [];  // 创建一个空的数组var i = Obj.length;while (i--) {buf[i] = clone(Obj[i]);}return buf;} else if (Obj instanceof Object){buf = {};  // 创建一个空对象for (var k in Obj) {  // 为这个对象添加新的属性buf[k] = clone(Obj[k]);}return buf;}else{return Obj;}
}

区别在于:对对象和数组类型判断

function deepClone(data) {var t = Object.prototype.toString.call(data), o, i, len;if(t === '[object Array]') {o = [];for (i = 0, len = data.length; i < len; i++) {o.push(deepClone(data[i]));}return o;}else if( t === '[object Object]') {o = {};for( i in data) {o[i] = deepClone(data[i]);}return o;}else {return data;}
}

这里有个点大家要注意下,对于function类型,博主这里是直接赋值的,还是共享一个内存值。这是因为函数更多的是完成某些功能,有个输入值和返回值,而且对于上层业务而言更多的是完成业务功能,并不需要真正将函数深拷贝。

但是function类型要怎么拷贝呢?

其实博主只想到了用new来操作一下,但是function就会执行一遍,不敢想象会有什么执行结果哦!o(╯□╰)o!其它暂时还没有什么好的想法,欢迎大家指导哦!

到这里差不多也就实现完了深拷贝,又有人觉的怎么没有实现浅拷贝呢?

对于浅拷贝而言,可以理解为只操作一个共同的内存区域!这里会存在危险!(。﹏。*) 。

如果直接操作这个共享的数据,不做控制的话,会经常出现数据异常,被其它部分更改。所以应该不要直接操作数据源,给数据源封装一些方法,来对数据来进行CURD操作。

到这里估计就差不多了,但是作为一个前端,不仅仅考虑javascript本身,还得考虑到dom、浏览器等。

Element类型

来看下面代码,结果会返回啥呢?

Object.prototype.toString.call(document.getElementsByTagName(‘div’)[0])

答案是[object HTMLDivElement]

有时候保存了dom元素, 一不小心进行深拷贝,上面的深拷贝函数就缺少了对Element元素的判断。而判断Element元素要使用instanceof来判断。因为对于不同的标签,tostring会返回对应不同的标签的构造函数。

function type(obj) {var toString = Object.prototype.toString;var map = {'[object Boolean]'  : 'boolean','[object Number]'   : 'number','[object String]'   : 'string','[object Function]' : 'function','[object Array]'    : 'array','[object Date]'     : 'date','[object RegExp]'   : 'regExp','[object Undefined]': 'undefined','[object Null]'     : 'null','[object Object]'   : 'object'};if(obj instanceof Element) {return 'element';}return map[toString.call(obj)];
}

其它方式?
1. jquery的实现
详见https://github.com/jquery/jquery/blob/master/src/core.js
2. underscore的实现

详见https://github.com/jashkenas/underscore/blob/master/underscore.js
3. lodash的实现

详见https://github.com/lodash/lodash/blob/master/lodash.js
4. JSON实现

先通过JSON.stringify一下,然后再JSON.parse一下,就能实现深拷贝。但是数据类型只支持基本数值类型。

var obj = {a: 'a',    b: function(){console.log('b')}
}//在JSON.stringify的时候就会把function给过滤了。JSON.stringify(obj)// "{"a":"a"}"

小结

这里大概总结了一下深拷贝,以及怎么实现一个深拷贝。在不同的场景下,要根据业务场景,判断是否需要使用深拷贝。

参考文献

文献一:winter-JavaScript中的类型 http://www.cnblogs.com/winter-cn/archive/2009/12/07/1618281.html

文献二:www.alloyteam.com/2017/08/12978/

转自:

伯乐在线/前端-小强

http://www.jmfq.cn/news/5157649.html

相关文章:

  • dw不用代码做网站/全网营销推广服务
  • 网站创建公司网站/制作网页的流程
  • 烟台做网站/国际新闻最新消息战争
  • 惠州市企业网站seo营销工具/培训机构加盟店排行榜
  • 前端如何做双语网站/网站关键词优化方案
  • 网站建设包括什么/市场营销方案怎么写
  • 医疗美容网站建设方案/站长工具的网址
  • 智慧新零售系统/网络网站推广选择乐云seo
  • 男女做爰全过程网站/成都sem优化
  • 怎么做软文链接打开后是自定义网站/今日大新闻
  • 南昌制作企业网站/chatgpt入口
  • 铜陵网站开发/推广赚钱平台
  • 学校网站素材/博客网站
  • 江苏省中医院网站建设/手机上可以创建网站吗
  • 图案设计素材/厦门seo计费
  • 西安市建设网站/无锡seo优化
  • 有专门做网站的公司吗/百度seo公司一路火
  • 网站开发工程师怎么样/无锡百度竞价公司
  • 购物网站建设技术难点/品牌关键词优化哪家便宜
  • 大学生做偷拍视频网站/腾讯疫情实时数据
  • 网站建设发展趋势/网络营销推广难做吗
  • 上海高端品牌网站建设专家/重庆关键词优化软件
  • 做特卖网站有什么网站/找个免费网站这么难吗
  • 安康那个公司做网站好/百度推广的广告靠谱吗
  • 上海紫昌网站建设/百度电话人工服务
  • 清空回收站 wordpress/人工智能培训班
  • 开题报告旅游网站建设/个人在百度上发广告怎么发
  • 上海专业网站制作开发/长沙seo网络营销推广
  • 中国建设银行信用卡官网站/免费的企业黄页网站
  • 环保局网站建设 自查报告/网上销售渠道