Day14-JavaScriptReferenceandValueCopy(Node+Vue+微信开发公众号)企业级产品全栈开发第一个周末班(10.28正式开课,欢迎抢seat)作者:?LiYuechun-TheTimeChaser简介:JavaScript30是由WesBos发起的为期30天的挑战。项目免费提供30个视频教程,30个挑战的入门文档,以及30个挑战方案的源码。目标是帮助人们在没有框架和库、没有编译器和引用的情况下用纯JavaScript编写东西。您现在处于本系列指南的第14位。完整的中文版指南和视频教程在ZEROtoONE全栈部落。项目效果按值操作原语类型按值操作。以下类型被认为是JavaScript中的基本类型:StringNumberBooleanNullUndefined基本数据类型赋值你可以理解为值拷贝。如果从深拷贝和浅拷贝的角度去想,可以理解为深拷贝。当你修改一个变量的值时,不影响其他变量的值。例子letage=100;letage2=age;console.log(age,age2);age=200;console.log(age,age2);letname='liyuechun';letname2=name;console.log(名称,名称2);名称='liyc';console.log(名称,名称2);可以看出,基本类型是按值操作的,新创建的变量会将值复制到新的变量中,各自的变化不会互相影响。通过引用操作对象Object类型是通过引用操作的。如果它不是基本类型之一,那么它就是一个对象。这里仔细看的话,JavaScript中的一切都可以看作是对象,甚至是基本类型(不包括null和undefined),但我们尽量不要钻到死胡同里。JavaScript中的一些对象:ObjectFunctionArraySetMapshallowcopyconstplayers=['Wes','Sarah','Ryan','Poppy'];//引用副本constteam=players;console.log(`players:${players}`,`team:${team}`);//我们执行以下操作:team[3]='Lux';console.log(`players:${players}`,`team:${team}`);constteam2=players.slice();console.log(`players:${players}`,`team:${team}`,`team2:${team2}`);如上效果所示,浅拷贝最重要的是指针。当你操作一个指针时,所有指针指向的同一个对象的值都会发生变化。深拷贝constplayers=['Wes','Sarah','Ryan','Poppy'];//新建数组,将原数组拼接成新数组constteam3=[].concat(players);//ES6传播语法constteam4=[...players];team4[3]='heeeehawww';console.log(`team4:${team4}`);constteam5=Array.from(players);console.日志(`team5:${team5}`);如上效果所示,但是当我们修改team4时,球员并没有发生任何变化,上面的contact,...,Array.from都是深拷贝,将原来对象的内容又拷贝了一遍,所以当你操作一个指针时,它不会影响到原来的对象。深拷贝和浅拷贝比较//创建对象objectconstperson={name:'李月春',age:29};//浅拷贝console.log(`person:${JSON.stringify(person)}`);constcaptain=person;captain.number=99;console.log(`person:${JSON.stringify(person)}`);console.log(`captain:${JSON.stringify(captain)}`);//深拷贝constcap2=Object.assign({},person,{number:99,age:12});console.log(`cap2:${JSON.stringify(cap2)}`);console.log(`人:${JSON.stringify(人)}`);JSON.stringify将对象转成字符串,打印时效果一目了然。captain=person属于浅拷贝Object.assign的三个参数,第一个参数属于初始值,其最终值为第二个和第三个参数的并集,如果第二个和第三个参数具有相同的属性,则第三个参数将覆盖第二个参数中的值。Nestedconstliyc={name:'李月春',age:100,social:{sina:'李月春-时光追逐者',facebook:'李月春'}};console.log(`liyc:${liyc}`);constdev=Object.assign({},liyc);console.log(`dev:${dev}`);constdev2=JSON.stringify(liyc);console.log(`dev2:${dev2}`);constdev3=JSON.parse(JSON.stringify(liyc));console.log(`dev3:${dev3}`);首先调用JSON.stringify()方法将对象解析为字符串,然后调用JSON.parse()方法将字符串解析为对象。这是一个小技巧,在处理对象的复制时很有用。Github源码全栈部落区块链部落
