参数传递
- 基本类型传值调用(值拷贝)
- 引用类型传共享调用(指针拷贝)
1.关键点是函数传参时,传入的是实参的拷贝,而不是实参本身。所以,基本类型传递的是变量的值的拷贝,而引用类型传递对象的指针的拷贝,其指针也是变量的值。所以传共享调用也可以说是传值调用。
2.值拷贝后,对值修改,自然不会影响原值。指针拷贝后,与原指针指向的是同一个对象,如果函数内修改对象的属性,刚原对象属性自然也变,但如果直接对指针拷贝赋予新值,即修改它的指向,则不会影响到原指针指向的原对象。
示例:
function changeStuff(a, b, c) {
a = a * 10;
b.item = "changed";
// 对对象重新赋值
c = {item: "changed"};
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num); // 10
console.log(obj1.item); //changed
console.log(obj2.item); //unchanged
可以看到,变量 a 的值就是 num 值的拷贝,变量 b c 分别是 obj1 obj2 的指针的拷贝。
函数的参数其实就是函数作用域内部的变量,函数执行完之后就会销毁。
变量 a 的值的改变,并不会影响变量 num。
而 b 因为和 obj1 是指向同一个对象,所以使用 b.item = "changed"; 修改对象的值,会造成 obj1 的值也随之改变。
由于是对 c 重新赋值了,所以修改 c 的对象的值,并不会影响到 obj2。