ECMAScript 中参数的传递
难度:⭐️⭐️⭐️
💌 ECMAScript 中所有函数的参数都是按值传递的。
按值传递 vs 按引用传递
在按值传递参数时,值会被复制到一个局部变量(即一个命名参数,或者用 ECMAScript 的话说,就是 arguments 对象中的一个槽位)。
在按引用传递参数时,值在内存中的位置会被保存在一个局部变量,这意味着 对本地变量的修改会反映到函数外部 。(这在 ECMAScript 中是不可能的)
传递对象参数
当传递的参数是原始值(简单数据类型)的时候,结果符合人的直观,不再赘述。
重点聊聊 传递的参数是对象 的情况,比如下面这个例子:
js
function setName(obj) {
obj.name = "Nicholas";
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"
结果就是,即使对象是按值传进函数的,obj 也会通过引用访问对象。
我们发现,在局部作用域中修改对象而变化反映到全局,看上去对象就是按引用传递的?那再来看这一个例子:
js
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"
我们将 obj 重新赋值,但是可以发现并没有影响到全局下的 obj 。
这表明函数中参数的值改变之后,原始的引用仍然没变。 当 obj 在函数内部被重写时,它变成了一个指向本地对象的指针。 而那个本地对象在函数执行结束时就被销毁了。
可以再看一个数组的例子:
js
const arr = [1, 2, 3]
function change(array) {
array[0] = 100
array = [4, 5, 6]
}
change(arr)
console.log(arr) // [ 100, 2, 3 ] (而不是[4,5,6])
对很多开发者来说,这一块可能会不好理解,毕竟变量有按值和按引用访问,而传参则只有按值传递。我认为 记住 / 理解 上面这两个例子就好。