首先,函数传参不论是传递基本类型值还是引用类型值,都相当于最基本的赋值语句 x = a
When we pass primitive values into a function, the function copies the values into its parameters. It’s effectively the same as using =
.
函数传参-基本类型值
1 | function foo(x) { |
上面的传参过程就相当于基本的赋值 x = a,然后 x ++,a 不会随之改变。
如果想要改变基本类型值,需要这样借助引用类型值:
1 | function foo(wrapper) { |
函数传参-引用类型值
1 | function foo(x) { |
观察上面的代码可以看到,a 在 x.push(4) 之后变为 [1,2,3,4] 。 x = [4,5,6] 并不能影响 a 的指向,所以 a 仍然指向 [1,2,3,4]。相当于下面这样(其实就是引用类型的赋值操作):
1 | let a = [1,2,3]; |
如果要将 a 的值变为[4,5,6,7],必须更改 x 原本指向的数组,而不是为 x (更改指向)赋值一个新的数组。
1 | function foo(x) { |
如果我们传递一个 a.slice(),那么这个过程就相当于 x = a.slice(),即进行了一次浅拷贝。
1 | function foo(x) { |