有两种基本上截然不同的方式可以操作数据的值,这两种技术分别叫做传值和传址。
传值:
当一个数据是通过值被操作的,那么,所关系的是数据的值。在赋值的过程中,对实际的值制作了一份拷贝,这份拷贝存储到一个变量、对象属性或数组元素中。拷贝的值和原始的值是分别存储在两个完全独立的值。当一份数据通过
值传递给一个函数,数据的一份拷贝被传递给这个函数;如果函数修改了这个值,修改只是影响到函数所拥有该数据的拷贝,而不会影响到原始的数据。最后当一个数据通过值和另一个数据做比较,两份截然不同的数据片段必须确实代表相同的值(这通常
意味着进行逐个字节的比较后发现它们是相等的)。
例子:
<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
传址和传值的对比:
| 传值 | 传址 |
复制 | 实际复制的是值,存在两个不同的 、独立的拷贝 | 复制的只是对数值的引用。如果通过这个新的引用修改了数值,这个改变对最初的 引用来说也可见。 |
传递 | 传递给函数的值是一个独立的拷贝,对它的改变在函数外部都没有影响。 | 传递给函数的是对数值的一个引用。如果函数通过传递给它的引用修改了数值,这个改变在函数外部也可见 |
比较 | 比较的是两个独立的值(通常逐字节比较),以判断它们是否相同 | 比较的是两个引用,以判断它们引用的是否是同一个值。对两个不同的数值的引用不相等,即使这两个数值是由相同的字节构成的。 |
分享到:
相关推荐
JavaScript中的引用和复制是理解其工作原理的关键概念。在JavaScript中,数据类型分为两大类:基本类型(包括数字、字符串、布尔值、null和undefined)和引用类型(对象、数组和函数)。这两种类型的变量在赋值和...
通过上述知识点的学习,我们可以更清晰地理解JavaScript中变量作用域的概念,以及传值与传址的区别,从而在编程实践中做出更合适的变量管理和函数设计。对于初学者而言,这不仅是入门的基础知识,更是编写可读、可...
JavaScript是一种动态类型的脚本语言,其变量、传值、传址和参数之间的关系是理解和使用JavaScript中的一个基础但关键点。接下来,我会详细解释这些概念。 首先,JavaScript中的变量可以存储两种类型的数据:基本...
本主题聚焦于JavaScript中的函数调用机制,特别是关于传值和传址的概念。理解这两个概念对于编写高效和可维护的代码至关重要。 首先,我们要明白在JavaScript中,变量有两种类型:基本类型(如字符串、数字、布尔值...
总结来说,JavaScript中的变量处理基于数据类型的不同:不可变类型通过值的复制进行赋值和函数参数传递,而可变类型通过引用的复制进行。这种设计允许JavaScript在处理不同类型数据时更高效地管理内存,同时提供了...
本文将对 JavaScript 基础知识点进行总结,涵盖数据类型、类型转换、作用域、变量提升、传值 VS 传址等知识点。 数据类型 JavaScript 中有 7 种基本数据类型:string、number、object、boolean、null、undefined ...
实际上,JavaScript总是以传值(byVal)的方式传递参数,但这并不意味着对于所有类型的值都表现为传统的传值行为。理解这一点的关键在于理解JavaScript中的值类型(如number、string)和引用类型(如Object、Array)...
传值和传址是两种不同的操作方式,传值复制的是值,而传址复制的是对象的引用。基本数据类型通常通过传值操作,而对象数据类型(如数组和函数)通过传址操作。 3. **字符串的特殊性**: JavaScript中的字符串是不...
在JavaScript中,传递参数主要分为“传值”和“传址”两种方式。当函数通过值传递参数时,实际上传递的是变量值的一个副本。这意味着在函数内部对参数进行修改不会影响到原始变量。相反,当函数通过引用传递参数时,...
在JavaScript中,基本数据类型如数字(Number)和布尔(Boolean)是通过传值的方式操作的,而对象类型如数组(Array)和函数(Function)则是通过传址的方式操作。 ### JavaScript中操作数据值的方式 JavaScript提供了三种...