js深浅拷贝:保证赋值后改变第二个变量的值,不影响第一个变量的值
创始人
2024-01-21 01:48:20

  • 对于基本数据来说,将一个变量赋值给另一个变量,第二个变量值改变了,不会影响第一个变量;
  • 但对于复杂类型中的对象来讲,将一个对象赋值给另外一个对象,其实是将放对象内容的地址赋值给了第二个对象,它们指的都是一个内容,当第二个对象把内容改了,那第一个对象指的也是这个内容,那就会造成第一个变量也会被改变;
  • 由此我们有了浅copy和深copy两个概念;
  • 浅拷贝:只能解决复杂类型对象中一级对象的赋值问题;
  • 一级对象指的是:value值只是基本的数据类型,例如:{name:”yiyi“,age:21}这样的;
  • 深拷贝:解决复杂类型的赋值问题;
  • 复杂类型指的是:例如:{name:"yiyi",location:{city:"zr",province:"hn"}};
  • 深浅拷贝都是为了保证赋值时,改变第二个变量的值(赋值号左边),不会影响第一个变量的值(赋值号右边);

1、浅copy:针对一级对象赋值问题的解决办法:

  • for循环遍历法:

结果:

  • “...”展开运算符法:
  

结果:

2、深copy:针对复杂数据类型

  • 函数递归调用法:
  • 函数递归:函数递归指的是在函数内容嵌套该函数;

(1)当myobj1内容只有对象格式时:

        //复杂对象:递归调用法:var myobj1 = {name:"yiyi",location:{city:"zr",province:"hn"}}var myobj2 = {}//封装一个函数function deepCopy(o2,o1){for(var i in o1){//复杂类型的表示方法:o1[i].toString()==="[object Object]"if(o1[i].toString()==="[object Object]"){o2[i]={}deepCopy(o2[i],o1[i])}else{o2[i]=o1[i]}}}deepCopy(myobj2,myobj1)console.log(myobj2,myobj1)

结果:

  • 当myobj2改变时,myobj1不会受影响;
  • toString是对象原型上的一个方法;
  • 数组类型的判断方式:

Object.prototype.toString.call(o1[i])==='[object Array]'

  • 复杂对象类型的判断方式:例如:myobj1 = {name:"yiyi",location:{city:"zr",province:"hn"}}

判断方式:Object.prototype.toString.call(o1[i])==="[object Object]"

(2)当myobj1内容既有复杂对象,又有数组格式时:

//复杂对象:递归调用法:var myobj1 = {name:"yiyi",location:{city:"zr",province:"hn"},horry:["sheying","paizhao","aimei"]}var myobj2 = {}//封装一个函数function deepCopy(o2,o1){for(var i in o1){//复杂类型的表示方法:o1[i].toString()==="[object Object]"if(Object.prototype.toString.call(o1[i])==="[object Object]"){o2[i]={}deepCopy(o2[i],o1[i])}else if(Object.prototype.toString.call(o1[i])==='[object Array]'){//数组类型判断方式:Object.prototype.toString.call(o1[i])==='[object Array]'o2[i]=[]//改为数组deepCopy(o2[i],o1[i])}else{o2[i]=o1[i]}}}deepCopy(myobj2,myobj1)console.log(myobj2,myobj1)

结果:

  • JSON.parse(JSON.stringify())法:
        //复杂类型:JSON.parse(JSON.stringify())法:var myobj1 = {name:"yiyi",location:{city:"zr",province:"hn"},horry:["sheying","paizhao","aimei"],introduction:undefined}var myobj2 = JSON.parse(JSON.stringify(myobj1))console.log(myobj1,myobj2)

结果:

  • JSON.parse()、JSON.stringify()这个方法可以直接实现赋值而且改变后面一个变量的值时,不会改变前面一个变量的值;
  • 但是缺点是不能赋值undefined值, 就是第一个变量如果有undefined值,将第一个变量赋值给第二个变量时,undefined值赋值不过去,会丢失;

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
进口奶粉的排名 荷兰奶粉十大排... 越来越乱的国内奶粉市场让很多宝妈宝爸都不知道该如何选择奶粉品牌,宝宝的安全是第一位,奶粉的质量以及口...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
不用扬鞭自奋蹄 乘势而上千帆竞... 思明区正全力向“两个进位”目标发起冲刺,努力为建设高素质高颜值现代化国际化的厦门作出“思明贡献”。(...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...