`

JavaScript的传值和传址

阅读更多
有两种基本上截然不同的方式可以操作数据的值,这两种技术分别叫做传值和传址。
  传值:
      当一个数据是通过值被操作的,那么,所关系的是数据的值。在赋值的过程中,对实际的值制作了一份拷贝,这份拷贝存储到一个变量、对象属性或数组元素中。拷贝的值和原始的值是分别存储在两个完全独立的值。当一份数据通过
      值传递给一个函数,数据的一份拷贝被传递给这个函数;如果函数修改了这个值,修改只是影响到函数所拥有该数据的拷贝,而不会影响到原始的数据。最后当一个数据通过值和另一个数据做比较,两份截然不同的数据片段必须确实代表相同的值(这通常
      意味着进行逐个字节的比较后发现它们是相等的)。
  例子:
 
<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的变量、传值、传址、参数之间关系的相关资料,需要的朋友可以参考下

    js代码-函数调用的传值和传址

    本主题聚焦于JavaScript中的函数调用机制,特别是关于传值和传址的概念。理解这两个概念对于编写高效和可维护的代码至关重要。 首先,我们要明白在JavaScript中,变量有两种类型:基本类型(如字符串、数字、布尔值...

    浅谈js中的引用和复制(传值和传址)

    JavaScript中的引用和复制,主要涉及到的是变量赋值时的传值和传址概念。在JavaScript中,不同的数据类型在赋值或作为函数参数传递时,会有不同的行为。 首先,JavaScript有七种数据类型:Undefined、Null、Boolean...

    javascript中的变量是传值还是传址的?

    总结来说,JavaScript中的变量处理基于数据类型的不同:不可变类型通过值的复制进行赋值和函数参数传递,而可变类型通过引用的复制进行。这种设计允许JavaScript在处理不同类型数据时更高效地管理内存,同时提供了...

    最新大厂前端面试题-面试指南JavaScript篇面试题.docx

    本文将对 JavaScript 基础知识点进行总结,涵盖数据类型、类型转换、作用域、变量提升、传值 VS 传址等知识点。 数据类型 JavaScript 中有 7 种基本数据类型:string、number、object、boolean、null、undefined ...

    JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享

    对于“JavaScript 函数参数是传值(byVal)还是传址(byRef)”这个问题,普遍存在一个误区:number,string等“简单类型”是传值,Number, String, Object, Array等“复杂类型”是传址。这样不对吗?为什么会有这样的...

    Javascript入门学习第三篇 js运算第1/2页

    上篇文章讲了js中的传值和传址 和 函数的作用域. 这章我们来探讨js中的变量,表达式,和运算符 还有一些 js 语句。 升级中……

    JavaScript 面试基础

    JavaScript 中变量申明分显式申明和隐式申明。显式申明使用 `var` 关键字,例如: ```javascript var i = 100; ``` 隐式申明直接使用赋值方式,例如: ```javascript i = 100; ``` 在函数中使用 `var` 关键字...

    Javascript 关于基本类型和引用类型的个人理解

    JavaScript是一种动态类型语言,它的变量可以存储两种不同的数据类型:基本类型和引用类型。这两种类型在内存管理和操作上有显著的区别。 1. **基本类型(Primitive Types)** - JavaScript的基本类型包括`Number`...

    2021-2022计算机二级等级考试试题及答案No.1494.docx

    - 函数调用时参数传递可以是传值或传址。 - 函数可以返回任何类型的值,包括结构体。 以上知识点涵盖了数据库备份、Java GUI编程、网络通信、网页开发、电子表格操作、内存管理、计算机制作、数据模型、文件处理...

Global site tag (gtag.js) - Google Analytics