ECMAScript中所有参数传递的都是值,不可能通过引用传递参数

  今天在看JavaScript高级程序设计(第三版)时,看到了这个问题:ECMAScript中所有参数传递的都是值,不可能通过引用传递参数。

  

  在我的印象中,其他语言比如C++等,传递参数有两种方式:一种是按值传递,另一种是按引用传递。难道JavaScript不能按引用传递?于是自己细细捋了一下,发现JavaScript其实是按值传递的(传递原始值和引用值,都是值)。

先验知识:

  1.在JavaScript中,原始类型的内容是存储在栈中,而对象的内容是存储在堆中,指向堆的地址存储在栈中。(Number、Stirng、Boolean、Null、Underfined这些基本数据类型,他们的值直接保存在栈中;Object、Function、Array、Date、RegExp这些引用类型,他们的引用变量储存在栈中,通过指针指向储存在堆中的实际对象)

  2.原始变量及他们的值储存在栈中,当把一个原始变量传递给另一个原始变量时,是把一个栈房间的东西复制到另一个栈房间,且这两个原始变量互不影响。引用值是把 引用变量的名称储存在栈中,但是其实际对象储存在堆中,且存在一个指针由变量名指向储存在堆中的实际对象,当把引用对象传递给另一个变量时,复制的其实是指向实际对象的指针,此时两者指向的是同一个数据,若通过方法改变其中一个变量的值,则访问另一个变量时,其值也会随之加以改变;但若通过 重新赋值  ,此时相当于重新开了一个房间 ,该值的原指针改变  ,而另外一个值不会随它的改变而改变。

  参考:https://www.cnblogs.com/lihuijuan/p/8625322.html   https://segmentfault.com/a/1190000012829900

验证过程如下:

function setName(obj){
  obj.name = '湖人总冠军' //参数按值传递,obj和person访问的是同一个对象,修改对象会表现在参数person上
  obj = {name: '76人总冠军'}; // obj指向一个新的地址,与person不再指向同一个地址
}
var person = new Object()
setName(person)
console.log(person.name)

 结果:

个人理解:在JS中,所有参数传递的都是值,原始类型传递的是存储在栈里的变量值,对象传递的是存储在栈里的内存地址, 都是通过复制栈里的值来传递, 所以是按值传递(都是栈内数据的拷贝)

###个人理解,如有出错,请指正###

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值