有两种基本上截然不同的方式可以操作数据的值,这两种技术分别叫做传值和传址。
传值:
当一个数据是通过值被操作的,那么,所关系的是数据的值。在赋值的过程中,对实际的值制作了一份拷贝,这份拷贝存储到一个变量、对象属性或数组元素中。拷贝的值和原始的值是分别存储在两个完全独立的值。当一份数据通过
值传递给一个函数,数据的一份拷贝被传递给这个函数;如果函数修改了这个值,修改只是影响到函数所拥有该数据的拷贝,而不会影响到原始的数据。最后当一个数据通过值和另一个数据做比较,两份截然不同的数据片段必须确实代表相同的值(这通常
意味着进行逐个字节的比较后发现它们是相等的)。
例子:
<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中的函数调用机制,特别是关于传值和传址的概念。理解这两个概念对于编写高效和可维护的代码至关重要。 首先,我们要明白在JavaScript中,变量有两种类型:基本类型(如字符串、数字、布尔值...
JavaScript中的引用和复制,主要涉及到的是变量赋值时的传值和传址概念。在JavaScript中,不同的数据类型在赋值或作为函数参数传递时,会有不同的行为。 首先,JavaScript有七种数据类型:Undefined、Null、Boolean...
总结来说,JavaScript中的变量处理基于数据类型的不同:不可变类型通过值的复制进行赋值和函数参数传递,而可变类型通过引用的复制进行。这种设计允许JavaScript在处理不同类型数据时更高效地管理内存,同时提供了...
本文将对 JavaScript 基础知识点进行总结,涵盖数据类型、类型转换、作用域、变量提升、传值 VS 传址等知识点。 数据类型 JavaScript 中有 7 种基本数据类型:string、number、object、boolean、null、undefined ...
对于“JavaScript 函数参数是传值(byVal)还是传址(byRef)”这个问题,普遍存在一个误区:number,string等“简单类型”是传值,Number, String, Object, Array等“复杂类型”是传址。这样不对吗?为什么会有这样的...
上篇文章讲了js中的传值和传址 和 函数的作用域. 这章我们来探讨js中的变量,表达式,和运算符 还有一些 js 语句。 升级中……
JavaScript 中变量申明分显式申明和隐式申明。显式申明使用 `var` 关键字,例如: ```javascript var i = 100; ``` 隐式申明直接使用赋值方式,例如: ```javascript i = 100; ``` 在函数中使用 `var` 关键字...
JavaScript是一种动态类型语言,它的变量可以存储两种不同的数据类型:基本类型和引用类型。这两种类型在内存管理和操作上有显著的区别。 1. **基本类型(Primitive Types)** - JavaScript的基本类型包括`Number`...
- 函数调用时参数传递可以是传值或传址。 - 函数可以返回任何类型的值,包括结构体。 以上知识点涵盖了数据库备份、Java GUI编程、网络通信、网页开发、电子表格操作、内存管理、计算机制作、数据模型、文件处理...