上海 [ 更换 ]
热门城市
北京上海广州深圳成都杭州南京武汉天津西安重庆青岛沈阳长沙大连厦门无锡福州济南宁波昆明苏州郑州长春合肥南昌哈尔滨常州烟台南宁温州石家庄太原珠海南通扬州贵阳东莞徐州大庆佛山威海洛阳淮安呼和浩特镇江潍坊桂林中山临沂咸阳包头嘉兴惠州泉州三亚赣州九江金华泰安榆林许昌新乡舟山慈溪南阳聊城海口东营淄博漳州保定沧州丹东宜兴绍兴唐山湖州揭阳江阴营口衡阳郴州鄂尔多斯泰州义乌汕头宜昌大同鞍山湘潭盐城马鞍山襄樊长治日照常熟安庆吉林乌鲁木齐兰州秦皇岛肇庆西宁介休滨州台州廊坊邢台株洲德阳绵阳双流平顶山龙岩银川芜湖晋江连云港张家港锦州岳阳长沙县济宁邯郸江门齐齐哈尔昆山柳州绍兴县运城齐河衢州太仓张家口湛江眉山常德盘锦枣庄资阳宜宾赤峰余姚清远蚌埠宁德德州宝鸡牡丹江阜阳莆田诸暨黄石吉安延安拉萨海宁通辽黄山长乐安阳增城桐乡上虞辽阳遵义韶关泸州南平滁州温岭南充景德镇抚顺乌海荆门阳江曲靖邵阳宿迁荆州焦作丹阳丽水延吉茂名梅州渭南葫芦岛娄底滕州上饶富阳内江三明淮南孝感溧阳乐山临汾攀枝花阳泉长葛汉中四平六盘水安顺新余晋城自贡三门峡本溪防城港铁岭随州广安广元天水遂宁萍乡西双版纳绥化鹤壁湘西松原阜新酒泉张家界黔西南保山昭通河池来宾玉溪梧州鹰潭钦州云浮佳木斯克拉玛依呼伦贝尔贺州通化朝阳百色毕节贵港丽江安康德宏朔州伊犁文山楚雄嘉峪关凉山雅安西藏四川广东河北山西辽宁黑龙江江苏浙江安徽福建江西山东河南湖北湖南海南贵州云南陕西甘肃青海台湾内蒙古广西宁夏香港澳门
培训资讯网 - 为兴趣爱好者提供专业的职业培训资讯知识

好程序员web前端培训分享JavaScript相关知识

培训

  好程序员web前端培训分享JavaScript相关知识,今天跟大家分享的是关于JavaScript相关知识。正在从事web前端工作的小伙伴们来一起看看吧,希望能够对大家有所帮助。

  (一)JS中基本类型和引用类型

  JavaScript的变量中包含两种类型的值:基本类型值和引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象。

  •基本类型值

  在JavaScript中基本数据类型有String,Number,Undefined,Null,Boolean,在ES6中,又定义了一种新的基本数据类型Symbol,所以一共有6种。

  基本类型是按值访问的,从一个变量复制基本类型的值到另一个变量后,这两个变量的值是完全独立的,即使一个变量改变了也不会影响到第二个变量。

  let str1 = "你好";

  let str2 = str1;

  str2 = "hello word"console.log(str2);//"hello word"

  console.log(str1); //"你好"

  •引用类型值

  引用类型值是引用类型的实例,它是保存在堆内存中的一个对象,引用类型是一种数据结构,最常用的是Object,Array,Function类型,此外还有Date,RegExp,Error等。

  在ES6中提供了Set,Map2种新的数据结构。

  (二)JS中如何复制引用类型的

  •基本类型和引用类型赋值的差异化

  举个例子:在下面代码中,只修改了obj1中的name属性,却同时改变了ob1和obj2中的name属性。

  let obj1 = {"name": "小明"};

  let obj2 = obj1;obj2.name = "小兰";

  console.log(obj1); // {"name": "小明"}

  console.log(obj2); // {"name": "小明"}

  当变量复制引用类型值的时候,同样和基本类型值一样会将变量的值复制到新变量上,不同的是对于变量的值,它是一个指针,指向存储在堆内存中的对象。

  因为,在JS中,堆内存中的对象无法直接访问,必须要访问这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值。

  (三)浅拷贝

  在JS中,如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址;所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

  下面是JavaScript提供的浅拷贝方法:

  Object.assign

  ES6中拷贝对象的方法,接受的第一个参数是拷贝的目标,剩下的参数是拷贝的源对象;

  语法:Object.assign(target, ...sources)

  let p = { "name": "hello word",};

  let copyP = {};

  Object.assign(copyP, p);

  console.log(copyP);console.log(p);

  Object.assign是一个浅拷贝,它只是在根属性(对象的第一层级)创建了一个新的对象,但是如果属性的值是对象的话,只会拷贝一份相同的内存地址。

  扩展运算符

  利用扩展运算符可以在构造字面量对象时,进行克隆或者属性拷贝。语法如下:

  let cloneObj = { ...obj };

  let obj = {"name": "星期一", "college": ["星期二","星期三","星期四"]}let obj2 = {...obj};

  obj.name="不休息";//{"name": "不休息", "college": ["星期二","星期三","星期四"]}console.log(obj);//{"name": "星期一", "college": ["星期二","星期三","星期四"]}

  console.log(obj2);

  obj.college.push("Go");//{"name": "不休息", "college": ["星期二","星期三","星期四"]}

  console.log(obj); //{"name": "不休息", "college": ["星期二","星期三","星期四"]}

  console.log(obj2);

  扩展运算符和Object.assign()存在同样的问题,对于值是对象的属性无法完全拷贝成两个不同对象;

  但是如果属性都是基本类型的值的话,使用扩展运算符更加简洁。

  (四)深拷贝

  浅拷贝只在根属性上在堆内存中创建了一个新的的对象,复制了基本类型的值,但是复杂数据类型也就是对象则是拷贝相同的地址。

  而深拷贝则是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

  JSON.stringify

  JSON.stringify()是目前开发过程中最常用的深拷贝方式,原理是把一个对象序列化成为一个JSON字符串,将对象的内容转换成字符串的形式再保存在内存中,再用JSON.parse()反序列化将JSON字符串变成一个新的对象。

  举个例子:

  let obj = { name: "少帅", age: 18, friends: ["阿大", "阿二"], goodF: { name: "水果", age: 19, address: "上海", pets: [{name: "西瓜"}, {name: "苹果"}]}, bir: new Date()};

  let newObj = JSON.parse(JSON.stringify(obj));

  obj.goodF.pets[0].name = "桔子";

  console.log(newObj);console.log(obj);

  使用JSON.stringify实现深拷贝有几点要注意:

  1)拷贝的对象的值中如果有函数,undefined,symbol,经过JSON.stringify()序列化后的JSON字符串中这个键值对会消失;

  2) 无法拷贝不可枚举的属性,无法拷贝对象的原型链

  3)拷贝Date引用类型会变成字符串

  4)拷贝RegExp引用类型会变成空对象

  5) 对象中含有NaN、Infinity和-Infinity,则序列化的结果会变成null

  递归实现深拷贝

  具体实现如下:

  /** * 辅助函数, 判定是否是对象 * @param obj * @returns {boolean} */

  function isObj(obj) { return obj instanceof Object;}

  /** * 深拷贝fromObj面的所有属性/值, 到toObj对象里面 * @param fromObj 拷贝对象 * @param toObj 目标对象 */

  function deepCopyObj2NewObj(fromObj, toObj) {

  for (let key in fromObj) {

  if(fromObj.hasOwnProperty(key)){

  let fromValue = fromObj[key]; // 如果是值类型,那么就直接拷贝赋值

  if (!isObj(fromValue)) {

  toObj[key] = fromValue;

  } else { // 如果是引用类型,那么就再调用一次这个方法, // 去内部拷贝这个对象的所有属性 // fromValue是什么类型, 创建一个该类型的空对象

  let tmpObj = new fromValue.constructor;

  // console.log(tmpObj); // debugger;

  deepCopyObj2NewObj(fromValue, tmpObj);

  toObj[key] = tmpObj;

  }

  }

  }}

  (五)总结

  1)在日常开发中一般并不需要拷贝很多特殊的引用类型,深拷贝对象使用JSON.stringify是最直接和简单的方法。

  2)实现一个完整的深拷贝是非常复杂的,需要考虑到很多边界情况。对于特殊的引用类型有拷贝需求的话,建议借助第三方完整的库,例如lodash.js。

  

  免责声明:本文图片及文字信息均由小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除。

相关内容

从客服代表转平面设计,年近30中专学历的我怎样完成华丽转身

“老师,你还记得我吗?我是小梅……”随着一个来电的接听,这个曾经给我留下深刻印象的名字跳入了我的脑海里。把我带入了去年底的一次咨询中。小梅出生在广东的一个小城,那个小城一直有重男轻女的传统。小梅作为家中的老小,上面还有一个哥哥,因为是女孩,···

2023上海软件开发培训机构排行榜告诉你35被优化的真相

被优化了?成为社会闲散人员了?开心从大厂毕业了?35岁被“优化”的真相是什么,是工作多年毫无长进,还是同事关系一滩烂泥,或者领导觉得你不善言谈?亦或是体力和精力都大不如年轻人,利用价值大大下降。其实小编认为其本质原因就是工作替代性太高,本身···

chat GPT角色指令人工智能AI

ai.aayay.cn点击进入AI聊天机器人 chat GPT3.5 4.0 MJ绘画等功能人工智能成像写论文,写代码,写文案,感情问题,一切关于学术问题都可以问机器人,辅助学习的好工具。以下是调教与使用GPT的指令集,人工智能成就未来,···

面对来势汹汹的ChatGPT,这届中产家长开始请人工智能给娃做私教

看点 自ChatGPT问世以来,很多行业大咖都预言过它会给教育带来巨变。可是具体怎么变?影响是好是坏?虽然尚无定论,但有些家长决定先下手为强,让ChatPGT成为孩子的“一对一”私教。AI也确实不负所托,不过,这个过程也让各位家长、教育者看···

上海靠谱的Java培训是什么标准

进入IT互联网行业,很多同学都选择了通过参加培训的方式,然而市面上大大小小的培训层出不穷,教学水平和质量参差不齐,但无一例外的都会有好的条件吸引你做出选择,那么在上海学习,如何在众多的培训中选择出适合自己的,靠谱的Java培训有哪些标准呢?···

上海哪个Java培训最好?

上海哪个Java培训最好?随着互联网的不断发展,IT行业成为目前最炙手可热的行业之一,也有越来越多的同学选择加入到这个行列中来,但是大家不知道如何去选择一家好的Java培训班,今天小编就来帮助大家在上海或者其它地区是怎么筛选的!1. 关注培···

上海正规Java培训机构怎么选

上海属于一线城市,当然能接触到最前瞻的Java技术,在上海找一家Java培训机构,自然比二三线城市要好。但一线城市Java培训机构也多,这就需要您的火眼金睛选一家比较靠谱的Java培训机构了。建议您呢,多方面考虑,实地考察吧。第一:上海Ja···

上海java培训业余班选哪里的好

就目前的发展趋势来看,IT行业的发展还是很不错的,尤其是java程序员这个岗位,就业前景十分广阔,薪资待遇也高,是很多人都向往的,有些其他行业的小伙伴也想学习java技术进行转行。那么,上海java培训业余班选哪里的好?这个问题就由动力节点···

上海Java培训机构哪家靠谱

像上海这样的一线城市,Java编程语言自然是火爆而流行的,培训机构肯定也是只多不少的,尤其是近年来IT互联网的快速发展,IT培训机构成倍增多,当然淘汰率也逐渐增长,具体的说上海Java培训机构哪家靠谱,不如您自己多方面的考量,综合考察,亲自···

上海java哪个培训机构好

随着国家对信息产业的拉动政策,5G的不断推动,对软件开发人员仍然有较大需求。随着5G时代的来临,5G行业的人才需求会伴随产业的不断发展逐渐增加,未来几年人才需求将增加几十万,甚至上百万。上海java哪个培训机构好?如果判断Java培训机构的···

上海最好的Java培训班有哪家

目前IT行业中Java软件开发的高薪资,待遇好,入门门槛低等原因,导致很多小白都想转行Java行业,那么身为小白,我们如何开始,为转行Java铺路呢?小编建议,尽量参加Java培训班,可能你会觉得Java培训班的学费太贵了,但是等你真正转行···

上海正规Java培训机构推荐,只有踩过坑的人才能说明白

上海正规Java培训机构有推荐吗?说实话,我们与其看推荐,不如真实的到校体验试学课程。面对IT行业这样的市场现状,不少同学开始思考如何进阶自己,提升竞争力,以便于更好的在这个行业中发展。最好是能够突破瓶颈,更上一层。不少同学将目光投向了上海···

UI设计培训课程学什么

学平面设计上海杨浦区哪个培训学校靠谱?上海哪里有平面设计培训学校?上海平面设计培训需要学多久?学设计到天琥天琥专注设计18年,一直广受学员的好评推荐,是设计培训行业具有规模和品牌影响力的机构。学前小测,30秒时间-看看你有没有当设计师的潜质···

UI设计要怎么学?学什么?上海UI设计培训

UI即User Interface(用户界面)的简称。UI设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。 技术上没什么···

上海Java培训机构排名榜单,不看后悔系列

上海Java培训机构排名榜单,不看后悔 学习Java编程不在是校内学生们的专利了,随着职场上竞争越来越激烈,毫无基础的或想要转行的求职者对于学习Java的积极性也是越来越高,因此,市面上涌现了大批的成人Java培训机构,为了不让大家纠结,小···

上海哪家UI设计培训机构好 就业率高

UI设计如此火爆,但我们在开始正式学习前,进行培训?机构选择时还是应该认真挑选,只有找到自己适合的机构,才能让自己拥有更多的学习动力,掌握到很好的学习方法,达到事半功倍的效果。天琥教育机构拥有十多年的教学培训经验,目前在全国拥有2···

学习UI设计上海去哪里比较好?

学习UI设计上海去哪里比较好?上海哪个UI设计培训机构靠谱?上海UI设计培训需要学些什么?学设计到天琥UI设计工作平均薪资8k+,市场发展空间大,是UI设计近几年火爆的原因之一。本信息来源于https://sh.bdsh5.com/。对于大···

2022年备考「嵌入式系统设计师」你准备好了吗?

2023年准备参加软考获取中级职业技术资格认证的小伙伴咱们约起吧?!研究了下电子工程师是否有证书,第一反应想到是没有的,后面一查,发现还真有与之相关的证书,一时间就去了解了下,是在软考的范围内的,下面是我对嵌入式系统设计师考试的了解,我还搜···

盘点2021年室内设计10大“出圈”事件

小编得带你了解一下,2021年,到底有哪些“出圈”的事件,值得你回顾的~01.《安邸AD》——发布中国版AD100榜△来源:安邸AD2013年,安邸AD首次推出中国版的AD100榜单,且每两年更新一次。2021年是安邸AD创刊的10周年,《···

室内设计培训机构哪里好?上海装修设计师培训班

很多零基础的小白对于学习室内设计都是十分恐惧的,毕竟自己还没有好的学习方法,一点基础都没有,不知道自己应该要怎么学好室内设计?自己要学多久才能出师?室内设计零基础怎么学?那么针对零基础的小白,我们应该怎么学好室内设计呢?有什么好的学习方法吗···