关于函数参数引用

函数参数的引用是按值引用的,这句话理解的不是很好。对于基本数据类型,比较好理解。具体例子也是常见:


var num1 = 10
var num2 = num1;
console.log(num2)//10
num2 = 0
console.log(num2)//0
console.log(num1)//10

就是num2 复制了num1的value.之后两个变量在栈stack中是并存的,互不影响的两个独立变量,修改一个值不会影响另一个。函数中体现如下:

  `
var count = 5
function test(num){
        num = 10
        return num

}
var res = test(count)
console.log(res)//10 //res是在函数中生成的新变量。传入时初始值为5,在函数内部被修改成10。而这一变化不影响count本身的值。
console.log(count)//5
`

引用数据类型在理解的时候要绕个弯。我们很容易答出下面的例子:


var obj = {
id:1
}
var obj2 = obj;
obj2.id=0
console.log(obj2.id)//0
console.log(obj.id)//0

对象在被复制时,是复制的指针。即obj和obj2在堆heap中是指向同一个位置的。obj2修改了该位置的值,就等于修改了obj的值。
在函数中也常见该知识的运用:


var vehicle1 = {
id:1,
plateNumber:'鲁B12345'
}
function reset(veh){
veh.id=0
return veh;
}
var result = reset(vehicle1)
console.log(result.id)//0 在函数内部,传入的是指向vehicle1的指针
console.log(vehicle1.id)//0

但是上面的例子怎么说明引用数据类型也是按值引用的呢?
有的人解释是:对于引用数据类型,其值就是指针。我目前也是这么理解的,但是还是有点不透彻,不像基础数据类型那样明白。但是有个例子很好的佐证了这个观点:

`
var obj1={
id:0
}
function testObj(obj2){
obj2 = {
id:2
}
return obj2;
}
var res = testObj(obj1)
console.log(res.id)//2
console.log(obj1.id)//0
res.id=4
console.log(res.id)//4
console.log(obj1.id)//0

`
在上面例子里,在函数内部重新实例化了一个对象。即函数参数初始值是传入的obj1 , 但是在函数内该变量的指针被修改,指向了id为2的位置,和obj1是互不影响的。当又一次修改res的id时,obj1仍然保持不变。
在这个例子里,作为被传递的引用类型的值:指针,一旦在函数内部被修改后,也和之前的变量失去了联系。

不知道上面的分析有无不妥之处,欢迎朋友们指出和交流。多谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值