以js为例解释按值传递和按引用传递

引用大神的一篇文章,个人觉得写得极好,故记录下来。点击打开链接

首先“ EMCAJavaScrip里面所有函数的参数传递都是按值传递” 这句话是公认的,没错的。

按值传递的意思就是形参是实参的复制。

按引用传递是 函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。

但是由于js中有简单数据类型,复杂数据类型。简单数据类型不用细说,很容易理解他的按值传递就是基本类型的复制,形参实参互不干扰。复杂数据类型复制:需要强调的一点是,保存对象的变量,它里面装的值是这个对象在堆内存中的地址。

所以在对象变量进行复制时,obj1和obj2都指向同一内存地址,所以在参数传递中,形参和实参指向同一内存地址,当改变形参的属性时,实参属性也变了。但是!!!如果直接改变形参本身,比如重新给形参分配一块内存,那么此时形参的改变就影响不到实参。所以复杂数据类型在传递时也并不是按照引用传递的。

以js为例解释按值传递和按引用传递_第1张图片

这种传递就是传说中的按共享传递 call by sharing

大神的文章里很清楚的写了这种传递,所以严格意义上来说,JS中基本类型按值传递,对象类型按共享传递的,这种传递也被应用在Java、Python中。

仔细看大神写的文章,思路会清晰很多。



你可能感兴趣的:(以js为例解释按值传递和按引用传递)