有两种基本上截然不同的方式可以操作数据的值,这两种技术分别叫做传值和传址。
传值:
当一个数据是通过值被操作的,那么,所关系的是数据的值。在赋值的过程中,对实际的值制作了一份拷贝,这份拷贝存储到一个变量、对象属性或数组元素中。拷贝的值和原始的值是分别存储在两个完全独立的值。当一份数据通过
值传递给一个函数,数据的一份拷贝被传递给这个函数;如果函数修改了这个值,修改只是影响到函数所拥有该数据的拷贝,而不会影响到原始的数据。最后当一个数据通过值和另一个数据做比较,两份截然不同的数据片段必须确实代表相同的值(这通常
意味着进行逐个字节的比较后发现它们是相等的)。
例子:
结果: i2: 10 i1: 5
传址:
使用传址只有一份真实的拷贝,被操作的是对该值的引用(地址)。如果以传址的方式操作一个值,变量并不会直接存储该值,它们只是存储该值的地址,被复制、传递和比较的都是这个地址。因此,在传址的赋值操作中,只是这个值的地址被赋值,而不是这个值的一份拷贝,
也不是这个值本身。在赋值之后,新的变量所指向的值和原始变量所指向的值相同。两个地址都是有效的,都可以用来操作这个值;如果值是通过一个地址发生了改变,这个改变也会通过原始地址表现出来。当一个值通过传址方式传递给函数的时候,情况也是相似的。值的地址传递给了函数,函数可以
使用这个地址来修改值的本身,任何这样的修改对外部的函数来说都是可见的。最后当一个值通过传址和另一个值比较的时候,两个地址进行比较来确定它们是否指向同一个值的唯一的拷贝,两个恰好相当的值。
例子:
结果是: a: 4,b: 5 a1: 4,b: 5
传址和传值的对比:
[table]
|| 传值 | 传址|
|复制|实际复制的是值,存在两个不同的 、独立的拷贝 |复制的只是对数值的引用。如果通过这个新的引用修改了数值,这个改变对最初的 引用来说也可见。|
|传递|传递给函数的值是一个独立的拷贝,对它的改变在函数外部都没有影响。| 传递给函数的是对数值的一个引用。如果函数通过传递给它的引用修改了数值,这个改变在函数外部也可见|
|比较|比较的是两个独立的值(通常逐字节比较),以判断它们是否相同 |比较的是两个引用,以判断它们引用的是否是同一个值。对两个不同的数值的引用不相等,即使这两个数值是由相同的字节构成的。|
[/table]
传值:
当一个数据是通过值被操作的,那么,所关系的是数据的值。在赋值的过程中,对实际的值制作了一份拷贝,这份拷贝存储到一个变量、对象属性或数组元素中。拷贝的值和原始的值是分别存储在两个完全独立的值。当一份数据通过
值传递给一个函数,数据的一份拷贝被传递给这个函数;如果函数修改了这个值,修改只是影响到函数所拥有该数据的拷贝,而不会影响到原始的数据。最后当一个数据通过值和另一个数据做比较,两份截然不同的数据片段必须确实代表相同的值(这通常
意味着进行逐个字节的比较后发现它们是相等的)。
例子:
<script type="text/javascript">
var i= 5;
test1(i);
function test1(i){
i = 10;
alert("i2: "+i);
}
alert("i1: "+i);
</script>
结果: i2: 10 i1: 5
传址:
使用传址只有一份真实的拷贝,被操作的是对该值的引用(地址)。如果以传址的方式操作一个值,变量并不会直接存储该值,它们只是存储该值的地址,被复制、传递和比较的都是这个地址。因此,在传址的赋值操作中,只是这个值的地址被赋值,而不是这个值的一份拷贝,
也不是这个值本身。在赋值之后,新的变量所指向的值和原始变量所指向的值相同。两个地址都是有效的,都可以用来操作这个值;如果值是通过一个地址发生了改变,这个改变也会通过原始地址表现出来。当一个值通过传址方式传递给函数的时候,情况也是相似的。值的地址传递给了函数,函数可以
使用这个地址来修改值的本身,任何这样的修改对外部的函数来说都是可见的。最后当一个值通过传址和另一个值比较的时候,两个地址进行比较来确定它们是否指向同一个值的唯一的拷贝,两个恰好相当的值。
例子:
<script type="text/javascript">
var xxx = {a:1,b:2};
test(xxx);
function test(xxx){
xxx.a=4;
xxx.b=5;
alert("a: "+xxx.a+",b: "+xxx.b);
}
alert("a1: "+xxx.a+",b1: "+xxx.b);
</script>
结果是: a: 4,b: 5 a1: 4,b: 5
传址和传值的对比:
[table]
|| 传值 | 传址|
|复制|实际复制的是值,存在两个不同的 、独立的拷贝 |复制的只是对数值的引用。如果通过这个新的引用修改了数值,这个改变对最初的 引用来说也可见。|
|传递|传递给函数的值是一个独立的拷贝,对它的改变在函数外部都没有影响。| 传递给函数的是对数值的一个引用。如果函数通过传递给它的引用修改了数值,这个改变在函数外部也可见|
|比较|比较的是两个独立的值(通常逐字节比较),以判断它们是否相同 |比较的是两个引用,以判断它们引用的是否是同一个值。对两个不同的数值的引用不相等,即使这两个数值是由相同的字节构成的。|
[/table]