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

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

  • 相关阅读:
    jquery基本用法
    js里BOM和DOM操作
    js基础语法
    java将json格式的字符串转化为对象数组
    Java生成Excel并导入数据
    mybatis的xml中使用foreach循环拼接(sql中的 in 语法)
    FreeMarker在List中取任意一条数据的某一个值
    freemarker中的常用语法
    Java将日期转化为大写格式(阿拉伯大写数字)
    项目中出现The import javax.servlet cannot be resolved 的解决方法
  • 原文地址:https://www.cnblogs.com/cskk/p/jsparms.html
Copyright © 2011-2022 走看看