js函数引用类型值的参数传递

《高程3》P70写道:“ECMAScript中所有函数的参数都是按值传递的”。

至于 基本类型 的 按值传递,很容易理解。如下:

js函数引用类型值的参数传递

js函数引用类型值的参数传递

但对于 引用类型 的 按值传递,就不那么好理解了。(个人觉得这里的 值 理解为指针/地址)高程中举的例子:

js函数引用类型值的参数传递

js函数引用类型值的参数传递

以上代码创建一个对象,并保存在变量person中,变量person被传递到函数setName()中之后复制给了obj。在这个函数内部,obj和person引用的是同一个对象。换句话说,即使这个变量是按值传递的,obj也会按引用来访问同一个对象。

为了证明对象是按值传递的,还有一个经过修改的例子:

js函数引用类型值的参数传递

js函数引用类型值的参数传递

将一个新对象赋给变量obj,同时将name属性设置为bbb。如果person是按引用传递的,那么person就会自动被修改为指向其name的属性值“bbb”的新对象,但是接下来访问person.name时,显示的值仍然是aaa,这说明,即使在函数内部修改了参数的值,但原始的引用仍然未变。(obj = new Object() 是改变obj的指向,此时obj指向一个新的内存地址,不再和person指向同一个)。实际上,当在函数内部重写obj时,这个变量引用的就是一个局部对象了,而这个局部对象会在函数执行完毕后立即被销毁。

js函数引用类型值的参数传递

在console中证明确实找不到obj这个对象:

js函数引用类型值的参数传递

当从一个变量向另一个变量复制引用类型值时,同样也会将存储在变量对象中的值复制一份放到位新变量分配的空间中。只不过,这个值的副本实际上是一个指针,这个指针指向存储在堆中的一个对象(简单概括,就是 指针/地址的复制 )。

因为上述例子obj = new Object() 改变obj的指向,因此,他指向的是一个新的对象,对这个新的对象进行的操作,也就不会对原来的对象产生影响了。