javascript和其他编程语言一样,有三种方式可以操作一个数据值:
第一种是复制,也就是说你可以把一个数据值复制给另外一个变量,例如
var a = 1;
var a = b;
在上例中,就是把a的值复制给了b。
第二种是传递,也就是说你可以把一个数据值传递给一个函数或者方法,例如
var a = 1;
function changeValue(arg){
return a +1;
}
changeValue(a);
第三种方式是比较,也就是说你可以比较两个值是否相等,例如
var a = 1,
var b = 2;
alert(a > b);
在javascript中,有两种不同的方式可以实现上面三种操作,传值和传址。
但一个数据通过传值进行操作的时候,在复制的过程中,复制的只是原始值的一份拷贝,把这份拷贝赋值给一个变量,对象的属性等,修改拷贝并不会影响到原始值,例如:
var a = 10;
var b =a;
b = 20;
alert(a);//10
alert(b);20
但把一个数值通过传值传递到一个函数或者方法中的时候,也是把原始值的一份拷贝传递到函数或者方法中,在函数或者方法中修改传递进来的值,也不会影响到原始值,例如:
var a = 10;
function changeValue(arg){
arg = arg + 10;
}
changeValue(a);
alert(a);//10
当一个数值通过传值的方式比较的时候,比较的是两个独立的值(通常按字节逐未比较),以判断他们是否相等,例如
var a = 10;
var b = a;
alert(a == b);//true
b = 20;
alert(a == b)//false
当一个数值是通过传址的方式操作的时候,数值只有一份真实的拷贝,被操作的是对象的引用(地址),所复制,传递,比较的都是对象的地址,当把一个数值的应用赋值给一个新的变量的时候,所赋值的是这个数值的引用,原始值和新值都指向同一份引用,其中任何一个修改都会修改数值,例如:
var obj = new Object();
obj.color = "red";
var newObj = obj;
newObj.color = "blue";
alert(obj.color);//blue
当通过传址的方式把一个数值传递给一个函数或者方法的时候,所传递的是这个数值的引用(地址),如果函数中修改了数值,那么原始数值也会被修改,例如:
var obj = new Object();
obj.color = "red";
function changeObj(newObj){
newObj.color = "blue";
}
changeObj(obj);
alert(obj.color);//blue
当通过传址方式进行比较的时候,说比较的是两个引用,判读他们是否引用同一个数值,如果是则相等,例如:
var obj = new Object();
obj.color = "red";
var newObj = obj;
newObj.color = "blue";
alert(newObj == obj)//true