JS:传值与传址

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的操作在函数外同样有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值