1. 传值变量
简单数据类型是按照传值进行传递的(有关数据类型请参见JS中的数据类型),当按照传值进行传递时,计算机就会在内存中开辟一块空间将值复制到里面。这样即使改变原变量的值也不会影响新的变量,反过来也一样。两者是独立的。
示例一:
var x = 15;
var y = x;
x = 30;
alert(x); //"30"
alert(y); //"15"
示例一中,x的值为15,该值被复制到y中。当在第3行中x的值改为30时,y的值仍为15。
示例二:
var x = 1;
var y = 2;
function change(x,y) {
var z = x;
x = y;
y = z;
alert(x); //"2"
alert(y); //"1"
}
change(x,y);
alert(x); //"1"
alert(y); //"2"
在示例二中,传递给函数change的是变量x、y值的复制。在函数中的修改并不会影响变量x、y值。
2. 传址变量
复杂数据类型可以包含大量复杂的信息,所以属于此类型的变量并不包含实际的值,它包含的是对值的引用。当变量需要它的值时,该引用会查询内容,然后返回,而无需将值传递给变量。
当多个变量都指向一个复杂数据类型时,它们获得的实际上是对这个复杂数据类型的一个引用。当这个复杂数据类型改变时,所有指向这个复杂数据类型的变量都将获得一个新值。
示例三:
var x = [1,2,3];
var y = [2,3];
function change(x,y) {
x[0] = 2;
var z = x;
x = y;
y = z;
alert(x); //"2,3"
alert(y); //"2,2,3"
}
change(x,y);
alert(x); //"2,2,3"
alert(y); //"2,3"
在示例三中,传递给函数change的是数组x、y的引用,或者说数组x与函数change中的参数x引用的是同一个对象,对于y也是一样。
当对参数x引用的对象做出改变时(x[0] = 2;),数组x也会获得这个改变。当程序进行到(x = y)这一步时,参数x引用的对象发生了改变。实际上,此时参数x和数组y引用的是同一个对象。但这不会对数组x引用的对象造成影响。
示例四:
var x = [1,2,3];
var y = [2,3];
function change() {
x[0] = 2;
var z = x;
x = y;
y = z;
alert(x); //"2,3"
alert(y); //"2,2,3"
}
change();
alert(x); //"2,3"
alert(y); //"2,2,3"
在示例四中,函数change中的x、y就是全局变量x、y,所以在函数中对x、y的操作在函数外同样有效。