所有函数的参数都是按值传递的,也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。所以如果能理解变量的复制,那么参数的传递也就很简单了。

1
2
3
4
5
6
7
8
9
10
let obj = {
name: 'Tom',
age: 15
}
function test(arr) {
arr.name = 'Toney'
}

test(obj)
console.log(obj) // {name: "Toney", age: 15}

总所周知,在JavaScript中,引用数据类型存储在堆中,传递时传递的实际上是指向此地址的一个指针,如上例,obj作为参数被传递到了函数内部,实际上相当于复制了一个指针,而指针指向的地址还是此对象所对应的地址,所以改变了函数的参数属性,实际上相当于操作obj的属性改变。

1
2
3
4
5
6
7
8
9
10
let obj = {
name: 'Tom',
age: 15
}
function test(arr) {
arr = {}
}

test(obj)
console.log(obj) // {name: "Tom", age: 15}

如上,当对参数arr再次赋值时,此时这个指针指向的地址就发生了改变,指向了所赋值的新对象{},从而与obj无关了。