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

在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. vue 前端框架

    什么是vue.js 1.vue是目前最火的一个前端框架,react 是最流行的前端框架(react除了开发网站,还可以开发手机APP,vue语法也是可以进行手机app开发的,需要借助于weex) 2. ...

  2. verdi\debussy的使用技巧

    verdi\debussy的使用技巧 转载from 大西瓜FPGA 大西瓜FPGA-->https://daxiguafpga.taobao.com fsdb display Debussy本身 ...

  3. NB-IoT有三种部署方式及特点【转】

    转自:http://blog.sina.com.cn/s/blog_13ddf053f0102wcbz.html NB-IoT有三种运营模式,一种是独立的在运营商的网络外面重做:第二种是在LTE的保护 ...

  4. 虎牙直播弹幕转换字幕格式 基于Node.js 的 huya-danmu

    1 首先安装nodejs运行环境, 从 http://nodejs.cn/download/ 下载对应的版本 2 安装 huya-danmu 模块, https://github.com/BacooT ...

  5. apache无法启动报错No space left on device

    apache无法启动报错No space left on device 故障现象:apache无法启动ipcs信号量很多 # service httpd startStarting httpd : [ ...

  6. technologies

    RPC Apache Thrift, Thrift is an interface definition language and binary communication protocol, lik ...

  7. .Net core----mongodb在插入数据时,会产生时间差的问题

    今天在给mongodb插入日期格式的数据时发现,日期时间相差8个小时,原来存储在mongodb中的时间是标准时间UTC +0:00,而中国的时区是+8.00 . 因此在插入的时候需要对时间进行处理: ...

  8. JAVA Scanner的简单运用

    package Code428; import java.util.Scanner; /*Scanner 可以实现键盘输入数据 引用的步骤1.import 包路径.类名称只有java.lang包下的内 ...

  9. 基于Https协议返回Jason字符串

    一:代码结构 二:框架结果: spring+springMvc+springJdbc 三:源代码 1:Ctrl 层 package com.todaytech.yth.gdsd.base.DataIn ...

  10. table td中的内容过长,显示为固定长度,多余部分用省略号显示

    简单描述:table数据过长,结果顶到下一格,影响了数据的查看 解决办法: 给table 加上style属性   另外 给td加上style标签修饰 <table class="tab ...