zoukankan      html  css  js  c++  java
  • javascript函数传值问题(传值?址)

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

    在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

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

  • 相关阅读:
    根据IP获取省市 .
    支付宝接口使用步骤及总结
    最新调用优酷视频 免前置广告的方法
    SQL新增数据取表主键最新值
    JS获取地址栏参数
    图片(img标签)的onerror事件
    prototype.js的Ajax对IE8兼容问题解决方案
    基于.net技术的 Rss 订阅开发
    JS获取Dropdownlist选中值
    阿里云tomcat启动慢
  • 原文地址:https://www.cnblogs.com/cskk/p/jsparms.html
Copyright © 2011-2022 走看看