【JS】javaScript引用传递和值传递

😕 ,在js里,没有指针的概念,相对来说,传值和引用就很难分清楚。

那么js是怎么回事呢。

首先 ,下面会发现将a赋值给b后,修改b的值a并没有改变,在第二张图里面,我们发现数组被添加新元素后,原来的数组页更新了,那么我们看第三个图,对象类型的引用也被更新了。

image.png

image.png

image.png

其实js对于普通标量(如NULL,1,2 ‘STR’),将这些量赋值给其他变量后,其他变量拥有的是副本,并不是是原先的引用。而对于复杂类型如数组其实就是对象来说,是对其原先的引用所以可以修改到原来的对象的数据。

但是如果你直接赋值一个新的值给它,比如下面的,将b重新赋值(注意是赋值,不是引用别的变量),再次查看呢c,发现数据没有更新,因为这时候c引用的量就是刚赋值的空对象。

image.png

总结一下就是,对于普通标量,原始值类型的,是直接获取原先的副本,而复杂对象而言获得是原先引用,如果你把新的变量重新赋值,使其引用改变,那么对原先的引用将失效。也就是说你只能更改新变量和老变量共同引用的值。

这里我们看一下function里面的传递,发现外部的变量并没有改变。

image.png

再试试复杂值,这里外部的值被改变了。js里的函数传递按照数组类型的不同而不同,如果你传递的是简单值,参数就是外部变量的副本,如果你传递复杂值,参数就是外部的引用,随意可以更改,同样的,如果重新给复杂值赋值,改变引用,也不会改变外部的值。那么如果给简单值包装一下呢 String(a)呢,将这个对象入参也是和简单值一样,因为js会将String除去,拿出简单值a。

image.png