基本类型和引用类型作为参数传递的区别 (引用类型传递参数时是传递的引用地址吗?)

基本类型传递值时:

function addTen(num) { 
 num += 10; 
 return num; 
} 
let count = 20;
let result = addTen(count); 
console.log(count); // 20,没有变化
console.log(result); // 30

这个代码块中函数 addTen() 中的 num 是局部变量,当调用这个函数时会把 count 中的值复制一份传给 num,参数 num 的值被加上了 10,但这不会影响函数外部的原始变量 count。

参数 num 和变量 count 互不干扰。

 

我们来看看引用类型传递值时:

function setName(obj) { 
 obj.name = "Nicholas"; 
} 
let person = new Object(); 
setName(person); 
console.log(person.name); // "Nicholas"

我们创建了一个对象,并把对象保存在 person 中,这个对象传给 setName 函数时,它的值复制给了函数内部的 obj,这时 obj 和 person 都指向了同一个对象,结论就是,即使对象是按值传递

进函数的,obj 也会通过引用访问对象。当函数内部给 obj 设置了 name 属性时,函数外部的对象也会改变,因为 obj 指向的对象保存在全局作用域的堆内存上。很多开发者错误的认为,当在

局部作用域中修改对象会反映到全局时,就意味着参数是按引用传递的。

为了证明对象是按值传递的,我们再来看看下面这个修改后的例子:

function setName(obj) { 
 obj.name = "Nicholas"; 
 obj = new Object(); 
 obj.name = "Greg"; 
} 
let person = new Object(); 
setName(person); 
console.log(person.name); // "Nicholas"

这个例子唯一变化就是  setName 中多了两行代码,把 obj  重新定义为一个新对象,赋值一个新的 name。当 person 传入 setName  时,name被定义为 'Nicholas' 。然后变量 obj 被设置为一个新对象,

并且 name 设置为一个新值。如果 person 是按照引用传递的,那么 person 会自动将指针改为指向 name 为 'Greg' 的对象,可是,当我们再次访问 person.name 时,它的值仍然是 'Nicholas' ,这表示

函数中 obj 值改变后,原始的引用仍然没变。当 obj 在函数内部被重写时,它变成了一个指向本地对象的指针,而那个本地对象在函数执行结束时就被销毁了。

注意: ECMAScript 中函数的参数就是局部变量。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值