美文网首页
关于JS传递参数是按值传递的理解

关于JS传递参数是按值传递的理解

作者: xiaoguo16 | 来源:发表于2017-07-30 16:44 被阅读0次

    今天看JS高程第四章时,里面讲到函数参数是按值传递的,当时有点不能理解,但是想了一会,豁然开朗。
    其实只要理解了什么是按值传递,什么是按引用传递即可理解。
    按值传递:传递的是副本,所以修改形参不会影响实参。
    按引用传递:传递的是实参本身,而非副本。
    而JS在传递参数时,会有一个临时变量来存放该参数,这个临时变量存放的是参数的副本。

    • 对于基本类型值来说,这个临时变量存放的就是这个基本类型值的副本。对这个参数的操作不会影响实参。如:
    var num=2;
    function  add(a){
       a=a+2;
      return a;
     }
    console.log(add(num))//4
    console.log(num)//2
    

    由于形参a存放的是num的副本,也就是形参a会将num的值复制过来,然后进行操作。所以num的值不受其影响。

    • 对于引用类型值来说,这个临时变量存放的是地址的副本。如:
    var obj={name:"gly"};
    function changeName(a){
      a.name="lq";
      return a.name;
    }
    console.log(changeName(obj))//"lq"
    console.log(obj.name)//"lq"
    

    因为参数a和obj是同一个地址,所以他们指向的都是同一个对象,因此对对象的修改也就反应到了obj中。
    再来一个例子:

    var obj={name:"gly"};
    function changeName(a){
      a.name="lq";
      a=new Object();
      a.name="aaa"
      return a.name;
    }
    console.log(changeName(obj))//"aaa"
    console.log(obj.name)//"lq"
    

    这个例子中由于对参数a赋值了一个新的对象,这样它的地址也就改变了,所以对它的属性的修改不会影响obj,因为他俩地址不同,指向的不是一个对象。

    所以说,不管传入的参数是基本类型还是引用类型,它们都是副本,只是一个是值的副本,一个是地址的副本。
    综上,JS传递参数其实可以看作是先进行变量的复制,再进行操作。而复制时,由于基本类型和引用类型的不同,所以复制的东西不同,对于基本类型,复制的是值,对于引用类型,复制的是地址。

    相关文章

      网友评论

          本文标题:关于JS传递参数是按值传递的理解

          本文链接:https://www.haomeiwen.com/subject/dufklxtx.html