详解:JS传递参数-按值传递不是按引用传递

传递参数
ECMAScript中所有函数的参数都按值传递。方法如同复制变量值。
访问变量有按值和按引用两种方式,参数只能按值传递。
在向参数传递引用类型的值时:把值在内存中的地址复制给一个局部变量,该局部变量的变化会反应在函数的外部。如下:

//验证引用类型参数按值传递而不是按引用传递
    function setName(obj) {//3、person被复制给了obj,就是新建了obj指针,obj的值即复制的person的值,
    						//即对象Object内存地址,所以obj同person一样指向了该对象
        obj.name = "Nike";//4、为对象添加name属性并赋值,obj访问name属性
        obj = new Object();//5、为obj重新定义一个对象(函数内部定义的对象为局部对象,函数执行完毕后会立即销毁),此时obj不指向函数外部的那个对象了,指向的对象是局部对象
        obj.name = "Greg";//6、为该局部对象定义一个不同的name属性,obj(person)访问name属性(指针与对象属性的关系??)
    }//7、函数执行完毕后,局部对象被销毁,obj没有再被继续使用,所以也被销毁了
//8、即使在函数内部修改了参数的值,但原始的引用仍然保持不变
    var person = new Object();//1、新建一个person指针,指针的值是新建的对象Object的内存地址
    						//所以person指针指向该对象。
    setName(person);//2、person被传递到setName函数中
    alert(person.name);//10、输出Nike
    //9、person依然指向该外部对象,name属性的值是Nike

如果是错误的认为 按引用传递呢?

//如果是按引用传递,那么***不同之处
    function setName(obj) {//***3、person传进了setName,相当于给person起了个小名叫obj,在函数内部使用这个小名,但是人都是person
        obj.name = "Nike";//***4、为对象添加name属性并赋值,obj(person)访问name属性(指针与对象属性的关系??)
        obj = new Object();//***5、为obj(person)重新定义一个对象(函数内部定义的对象为局部对象,函数执行完毕后会立即销毁),此时obj(person)不指向函数外部的那个对象了,指向的对象是局部对象
        obj.name = "Greg";//6、***为该局部对象定义一个不同的name属性,obj(person)访问name属性(指针与对象属性的关系??)
    }//***7、函数执行完毕后,局部对象被销毁,obj(person)后面仍被使用,所以没被销毁
//***8、在函数内部更改了person指向的对象和属性
    var person = new Object();//1、新建一个person指针,指针的值是新建的对象Object的内存地址,所以person指针指向该对象。
    setName(person);//2、person被传递到setName函数中
    alert(person.name);//10、输出Greg
    //***9、person指向内部对象,name属性的值是Greg

但是!经过测试,输出的是Nike,所以证明Java参数是按值传递而不是按引用传递!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值