传值或传引用?

JavaScript中,有函数,有要传到函数里面的参数。但是JavaScript是怎样处理和传递参数的并不一定清楚。在JavaScript里面,对任何变量都没有传递引用的说法。所有变量和参数都是赋值的,但是对于对象变量的值是引用。 因此,当你传递一个对象,并且改变它的成员,这些改变会影响到函数的外面。看起来好像传递引用一样。这样原生值,如数字,字符串,布尔值,是传值的,对象和数组传递的时候如上所说是传递引用。

用原生数据类型

在原生数据类型的情况,如果在函数里面改变原生类型的值,在函数外面的变量将不受影响。这意味着函数里面的任何对变量的改变都是完全独立于函数外面的。看下面的例子讲解:

var toDay = "Sunday";
function changeDay(tmpDay){
tmpDay = "Monday";
}
alert(toDay); // "Sunday"
changeDay(toDay);
alert(toDay); // "Sunday"

上面的例子,我们在函数changeDay里面改变"toDay"变量,并且在调用函数之后就显示它,它仍然有"Sunday"的值。这是因为原生类型是传值。这就意味着函数里面对变量的修改完全独立于函数外面的变量。这就是说JavaScript的变量是传值的。

用对象

在对象的情况,如果在函数里面改变了对象的属性,这个改变将影响到外面的变量。所有的变量和参数靠值传递,但是对于对象来说,变量的值是一个引用。传递引用导致有两个引用指向内存中的同一个对象。这就意味着你可以改变,并且对象或函数可以赋值给其他的对象,或者作为参数传递给一个函数。看下面的例子:

var thisWeek = {
toDay: "Sunday"
};
function changeDay(tmpWeek){
tmpWeek.toDay = "Monday";
}
alert(thisWeek.toDay); //Sunday
changeDay(thisWeek);
alert(thisWeek.toDay); //Monday

在上面的例子中,我们在函数changDay里面改变了"toDay"变量,并且在调用函数后,显示它,toDay被改成了"Monday" 。这是因为当传递一个对象到函数里面时,传递的不是拷贝,传递的是指向thisWeek对象的一个引用。所有当在函数当中改变了对象的一个属性的时候,实际上也改变了外面的这个对象的这个属性。

理解传值和传引用的区别,是理解JavaScript的对象和原生类型如何工作的关键

原文链接