通常对于我们开发者来说,有不少人是忽略了这些小问题的,但是我们又必要去了解.因为今天一个朋友问起,所以写到这里来了,

在C#中,我们知道如果要往一个函数中传递参数的类型为对象,数组或者其他引用类型时.

实际上传递过去的是对象的地址.

那么在javascript中,是否会有什么差异呢?下面我们需要通过例子来证明.

var par1 = 1; //数字(值类型)
var par2 = []; //数组(引用类型)
var par3 = {}; //对象(引用类型) function Test(par1, par2, par3) {
par1 = 3;
par2 = [1, 2, 3];
par3 = {a:1};
} Test(par1, par2, par3); alert(par1);//输出1
alert(par2);//输出空白
alert(par3.a);//输出undefined

上面这段代码我们首先分别定义了值类型par1, 引用类型par2,par3,并传入到Test函数中.

但是par2,par3输出的仍然是之前的数据.

是不是说如果在调用函数时传入引用类型,其实也是传递值呢? 其实不是的.

数组、对象等引用类型也是按值传递,但是这里的值是指变量地址的值

前面的例子中,当我们将par2,par3传入函数的时候,其实就有了地址的副本,这些副本就和外面par2,par3的地址指向是一样的.

但是我们为par2, par3赋了值, 改变了地址指向,于是地址就指向了新的对象和数组.这样其实内部和外部的par2,par3就不是指向同一个地址的了.

为了证明这个问题,我们可以试着不赋值给他们,而是直接使用自身的对象.代码如下:

var par1 = 1; //数字(值类型)
var par2 = []; //数组(引用类型)
var par3 = {}; //对象(引用类型) function Test(par1, par2, par3) {
par1 = 3;
par2.push(10);//操作自身对象
par3.a = 2; //操作自身对象
} Test(par1, par2, par3); alert(par1);//输出1
alert(par2);//输出10
alert(par3.a);//输出2

事实证明了,当我们调用函数传入值类型参数时,我们传入的就是值,传入引用类型的值时,我们传入的,就是他们的地址.

javascript函数传值问题(传值?址)的更多相关文章

  1. JavaScript 函数参数是传值(byVal)还是传址(byRef)?

    对于“JavaScript 函数参数是传值(byVal)还是传址(byRef)”这个问题,普遍存在一个误区:number,string等“简单类型”是传值,Number, String, Object ...

  2. javascript的变量,传值和传址,参数之间关系

    先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型) ...

  3. javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象

    对象字面量  JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay&quo ...

  4. Javascript函数(定义、传值、重载)

    Javascript 函数的定义的方式有不止一种. 第一种方式: function fn1(){ alert(typeof fn1); alert(“fn1”); } 在调用的时候直接就可以fu1() ...

  5. Asp:函数是用传值还是传址

    传址会把变量的内存地址传递到sub里,在sub里对变量所做的修改就是对原来的变量进行修改,而传值只是把变量的值传递到sub里,此时在sub里修改变量的值不会影响原来的变量. 在vb中调用函数默认是传址 ...

  6. C# 函数的传值与传址(转)

    http://www.cnblogs.com/mdnx/archive/2012/09/04/2671060.html using System; using System.Collections.G ...

  7. Java传值和传址

    调用函数时,传的参数过去可能是传值,也可能是传址.如果是传值,函数内部的操作对参数的值没有影响:如果是传址,函数内部的操作是对参数指向的内存进行操作,会影响参数的值. Java到底是传值还是传址?用下 ...

  8. Python的传值和传址与copy和deepcopy

    1.传值和传址 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会 ...

  9. 图解JS的传值与传址

    //编程过程中经常会碰到传值,传址的问题!今天的主题就是关于传值.与传址. //先讲讲赋值操作 //下例是原始类型赋值操作 var a=1,b=a,a=2; console.log("a=& ...

  10. 工控随笔_18_西门子_WinCC的VBS脚本_07_变量作用域和传值、传址

    在vbs脚本中也存在和其他编程语言一样的概念,那就是变量的作用域,变量的作用域决 定在什么范围内可以访问. 同样的在vbs脚本中对于变量也有一个生命周期, 变量的生命周期决定了变量的存续时间 这个主要 ...

随机推荐

  1. 软件测试面试-如何高质量提交缺陷bug?

    从实际工作中整理,如下:如有补充可以讨论! 所以会发现现在的面试题大部分问的都是工作中出现的场景了,而不是单纯的背诵 1:充分理解需求规则.原型图,知道预期结果,操作时判断是否为bug 解析:预期结果 ...

  2. java学习笔记08-switch case语句

    switch是一种选择语句,可以通过匹配某个条件,来执行某块代码 switch(expression){ case value: break;//可选 default://可选 //语句 } swit ...

  3. 在OS X 10.9配置WebDAV服务器联合NSURLSessionUploadTask实现文件上传

    iOS7推出的NSURLSession简化了NSURLConnection的文件上传和下载的工作,本文记录如何配置WebDAV服务以支持PUT方式的文件上传. 一. 配置WebDAV服务器 1. 修改 ...

  4. django会话

    django会话 可以把会话理解为客户端与服务器之间的一次会晤,在一次会话过程中有多次请求和响应,但是由于HTTP协议的特性-->无状态,每次浏览器的请求都是无状态的,无法保存状态信息,也就是说 ...

  5. 移动端web app开发学习笔记

    移动web和pc端web以及web app 移动web开发跟web前端开发差别很小,使用的技术都是html+css+js.手机网页可以理解成pc网页的缩小版加一些触摸特性.在浏览器中进行的网页开发,最 ...

  6. docker bulid命令

    使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1. docker build -t runoob/ubuntu:v1 . 使用URL github.com/cr ...

  7. leetcode python快乐数

    编写一个算法来判断一个数是不是“快乐数” “快乐数”的定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复该过程直到为1,也可能是无限循环但始终变不到1. 如果可以变为1,那 ...

  8. 15 个 Eclipse 常用开发快捷键使用技巧

    15 个 Eclipse 常用开发快捷键使用技巧 1.alt+? 或 alt+/:自动补全代码或者提示代码 2.ctrl+o:快速outline视图 3.ctrl+shift+r:打开资源列表 4.c ...

  9. Chrome插件触发web页面的事件

    Chrome插件中不能直接调用Web页面的元素js,原因是chrome插件的机制http://stackoverflow.com/questions/17819344/triggering-a-cli ...

  10. ASP.NET Core快速入门学习笔记(第3章:依赖注入)

    课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务16:介绍 1.依赖注入概念详解 从UML和软件建模来理解 从单元测试来理 ...