在JavaScript中,可以按值传递,也可以按引用传递。两者之间的主要区别在于,按值传递发生在分配原始类型时,而按引用传递发生在分配对象时。接下来就跟着智哥一探究竟吧。1.了解基本类型和对象JavaScript提供了两种数据类型:基本类型和对象。基本类型是数字、布尔值、字符串、符号、空值、未定义。//基本类型constnumber=10;constbool=false;conststr='Hello!';constmissingObject=null;constnothing=undefined;第二种是对象,普通对象,数组,函数等都是对象。//对象constplainObject={prop:'Value'};constarray=[1,5,6];constfunctionObject=(n1,n2)=>{return1+n2;};换句话说,任何不是原始类型的值都是对象。2.值值传递的简单规则就是JS中所有原始类型都是值传递,就这么简单。按值传递意味着每次将值分配给变量时,每次都会创建该值的副本。举个例子,假设我们有两个变量a和b:leta=1;letb=a;b=b+2;console.log(a);//1console.log(b);//3第一条语句声明了一个变量a并赋值为1。第二条语句声明了一个变量b并将a的值赋给它。最后,b=b+2增加2,变为3。b变量发生变化,而该变化不会影响a的值。3.引用通过引用传递与通过值传递不同。创建对象时,将获得对该对象的引用。如果两个变量持有相同的引用,那么更改对象将反映在两个变量中。请看下面的代码:lety=x;y.push(2);console.log(x);//[1,2]console.log(y);//[1,2]第一条语句让x=[1]创建一个数组,定义一个变量x,并使用对创建的数组的引用来初始化该变量。然后让y=x定义一个变量y,并用x变量中存储的引用来初始化y,这是一个传递引用。y通过y.push(2)更改数组。因为x和y变量引用同一个数组,所以这种变化反映在两个变量中。注意:为简单起见,我说变量包含对对象的引用。但严格来说,JavaScript中的变量保存的值是对对象的引用。4.值的比较和引用的比较在比较对象的时候,理解值和引用的区别是非常重要的。使用严格比较运算符===时,如果两个变量具有相同的值,则它们相等。以下所有比较都是相等的constone=1;constoneCopy=1;console.log(one===oneCopy);//trueconsole.log(one===1);//trueconsole.log(one===one);//trueone和oneCopy具有相同的值1。当两个操作数都为1时,运算符===的计算结果为true。但是比较运算符===在比较引用时的工作方式不同。2个引用只有在引用完全相同的对象时才相等。ar1和ar2持有不同数组实例的引用:constar1=[1];constar2=[1];console.log(ar1===ar2);//falseconsole.log(ar1===[1]);//falseconstar11=ar1;console.log(ar1===ar11);//trueconsole.log(ar1===ar1);//truear1和ar2指的是同一个数组结构,但是ar1的计算结果===ar2为假,因为ar1和ar2引用不同的数组对象。比较运算符仅在比较指向同一对象的引用时返回真:ar1===ar11或ar1===ar1。5.总结在JavaScript中,原始类型作为值传递:意味着每次分配一个值时,都会创建该值的副本。另一方面,对象(包括普通对象、数组、函数、类实例)是引用。如果您修改一个对象,则引用该对象的所有变量都将看到更改。比较运算符区分比较值和引用。持有引用的2个变量只有在引用完全相同的对象时才相等,但是,只要变量具有相同的2个值(来自变量、字面量等),变量就相等。~完了,我是耍玩志,下期见!作者:Ahmadshaded译者:FrontendXiaozhi来源:sitepoint原文:https://dmitripavlutin.com/value-vs-reference-javascript/
