
按值傳遞 VS. 按引用傳遞
按值傳遞(call by value)是最常用的求值策略:函數的形參是被調用時所傳實參的副本。修改形參的值并不會影響實參。
按引用傳遞(call by reference)時,函數的形參接收實參的隱式引用,而不再是副本。這意味著函數形參的值如果被修改,實參也會被修改。同時兩者指向相同的值。
按引用傳遞會使函數調用的追蹤更加困難,有時也會引起一些微妙的BUG。
按值傳遞由于每次都需要克隆副本,對一些復雜類型,性能較低。兩種傳值方式都有各自的問題。
例子:
按值傳遞
function change(num){
// 這里對num這個變量創(chuàng)建了一個內存的副本
var num=num+1;
return num;
}
var num=1;
console.log("內部的",change(num)); //2
console.log("外部的",num); //1
按引用傳遞
var obj={
name:"xiaoming"
}
function change2(obj){
//當前obj對內存的這個地址指向同一個
obj.age=20;
console.log("內部的",obj)
}
change(obj)
console.log("外部的",obj)
//內部的{name:"xiaoming,age:20}
//外部的{name:"xiaoming,age:20}
按引用傳遞:object,array(js對象)
按值傳遞:string,number,boolean