美文网首页
js函数的参数是值传递还是引用传递?

js函数的参数是值传递还是引用传递?

作者: xuehairong | 来源:发表于2019-01-31 12:03 被阅读0次
    • 基本类型:Undefined、Null、Boolean、Number 和 String,这 5 种基本数据类型是按值访问的。
    • 引用类型:Object。是按引用访问的。
    • 按值传递参数:函数外部变量a传给函数b,在函数内部改变b的值,a不会跟着改变。
    • 按引用传递参数:函数外部变量a传给函数b,在函数内部改变b的值,a也会跟着改变。
    var num1=5;
    var num2=num1;
    
    基本类型的复制
    var obj1 = new Object(); 
    var obj2 = obj1; 
    obj1.name = "Nicholas"; 
    alert(obj2.name); //"Nicholas" 
    
    引用类型的复制

    划重点:

    ECMAScript 中所有函数的参数都是按值传递的。

    也就是说把参数从函数外部传入函数参数,跟上面描述的复制原理是一样的。
    基本类型参数的例子:

    function addTen(num) { 
     num += 10; 
     return num; 
    } 
    var count = 20; 
    var result = addTen(count); 
    alert(count); //20,没有变化
    alert(result); //30 
    

    引用类型的参数就有点混淆了:

    function setName(obj) { 
     obj.name = "Nicholas"; 
    } 
    var person = new Object(); 
    setName(person); 
    alert(person.name); //"Nicholas" 
    

    第一眼看上去貌似,我在函数内部改了参数obj的值,函数外部person的值也跟着变了啊,这不就是引用传递,其实不是,我们接着看:

    function setName(obj) { 
     obj.name = "Nicholas"; 
     obj = new Object(); //新添加
     obj.name = "Greg"; //新添加
    } 
    var person = new Object(); 
    setName(person); 
    alert(person.name); //"Nicholas" 
    

    我们在上面的例子里添加2行代码,在函数内部把参数obj重新定义了一个对象,并赋值,会发现personname还是"Nicholas"并没有变成"Greg"

    以上我们可以总结,任何参数传递都是把外部的值复制给函数的参数,但如果参数是引用类型,复制的是引用罢了,具体参考上图【引用类型的复制】

    相关文章

      网友评论

          本文标题:js函数的参数是值传递还是引用传递?

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