zoukankan      html  css  js  c++  java
  • JS的函数参数传递为值传递

    function setAge(i)
    
    {
        alert(i);//24
        i = 18;
        alert(i);//18,i的改变不会影响外面的age
    };
     
    var age = 24;
    setAge(age);
    alert(age);//24

     

     当传入的是 基本类型的参数时:就是复制了份内容给i而已,i与age之间没有关系。

    function setName(obj)
    
    {
        obj.name = 'haha';
    };
     
    var obj2 = {};
    setName(obj2);
    alert(obj2.name);    //  haha
    

      当传入的参数为引用类型时:这看起来很像是传递的是引用,因为obj.name受到改变了,但其实不是,其实还是值,因为obj2本身的值就是新对象的地址,所以传进去的就是这个地址。

    这是阿里2014年的笔试题: 
    
    var a = 1;
    
    var obj = {
        b: 2
    };
    var fn = function () {};
    fn.c = 3;
     
    function test(x, y, z) {
        x = 4;
        y.b = 5;
        z.c = 6;
        return z;
    }
    test(a, obj, fn);
    alert(a + obj.b + fn.c);
    答案:12
    
     首先test传递进去的实参中,a是基本类型(,复制了一份值),obj是object(指向地址,你动我也动),fn也当然不是基本类型啦。在执行test的时候,x被赋值为4(跟a没关系,各玩各的,a仍然为1),y的b被赋值为5,那obj的b也变为5,z的c变为6,那fn的c当然也会是6. 所以alert的结果应该是1+5+6 =12. (其实test不返回z也一样,z仍然改变的)。
    

      

  • 相关阅读:
    正则表达式---用户验证
    最短路 Dijkstra
    最短路 Dijkstra+堆优化
    LCIS(最长公共上升子序列)
    最小生成树 Kruskal
    网络流 最大流
    网络流 最小费用最大流
    树链剖分
    树状数组
    双重Hash
  • 原文地址:https://www.cnblogs.com/yiyi17/p/8796743.html
Copyright © 2011-2022 走看看