JavaScript函数的参数传递取决于参数的类型:
- 若参数为基本类型,那么按值传递
- 若参数为引用类型,那么按共享传递
“按共享传递”是“按值传递的特殊情况” -- 值是对象存储地址的副本(address copy)。“按共享传递”的特点可一句话概括为:改属性不改对象。
1、按值传递(call by value)
//函数内部参数的改变并没有影响到外部变量
function foo(a) {
a = a * 10;
}
var num = 10;
foo(num);
console.log(num); // 10 没有变化
2、按共享传递(call by sharing)
function bar(b) {
b.item = "new_value"; // 参数b得到了obj1的地址,也叫"指向obj1"
console.log(b === obj1) ; // true
}
var obj1 = {item: "old_value"};
bar(obj1);
console.log(obj1.item); // new_value
function baz(c) { // c是参数,作用域是函数内
c = {item: "changed"}; // c绑定到了新的对象地址
console.log(c === obj2); // false 因为c已经改变了,与原来的不同
}
var obj2 = {item: "unchanged"};
baz(obj2);
console.log(obj2.item); // unchanged