• 作者:老汪软件技巧
  • 发表时间:2024-10-08 21:01
  • 浏览量:53

按值传递、按引用传递

想必大家都有听过js的按值传递和按引用传递,最近逛博客看到说按引用传递误人子弟,搜寻资料后有了一些顿悟,js中基本都是按值传递!首先看下面的代码:

let obj = { a: 1 }
const f = obj
f.a = 2
console.log(f.a)
console.log(obj.a)

相信大家都能知道,打印结果都是2,但是需要注意的是这里仍然是按值传递而不是按引用传递,具体说是let obj = { a: 1 }将{a:1}对象放在的堆地址里而把指向这个对象的地址放在了栈里,将obj赋值给f时是将obj栈中的引用的地址赋值给了f,后续在修改f.a时顺着地址修改了堆地址里的对象,所以是这个结果。好的这一块相信大家之前也了解,下面这一块才是最近的新发现,看下面的代码:

js函数参数按值传递!

传递函数的参数__函数从传递参数的角度分为

function f(obj){
obj = {a:2}
}
let o = {a:1}
f(o)
console.log(o.a)

打印结果是1,不是2!这一块就需要深刻理解按值传递了。首先记住,js的函数从来都是按值传递!像上面说的let o = {a:1}初始化过程,会将对象{a:1}放在堆里,把指向它的引用地址放在栈里,在这里f(o)是将o栈里的指向地址作为参数传递,因此在刚进入函数且obj = {a:2}执行前,实际情况如下:

o的引用地址传入函数后,函数会在栈里创建一个形参obj接收,而在后续函数里执行的obj = {a:2}则是在堆里创建了新对象{a:2}且将obj的引用地址指向新对象{a:2},如下图:

上面这个代码之前本人一直以为是作用域的问题,显然是之前理解有误。


Top