JS函数传参,之读《JS高程(第四版)》 4.1.3章节的感想

50 阅读1分钟

最近,在看 《JS高程(第4版)》的 4.1.3 传递参数这一小节的时候,看着书上的内容,产生了一些困惑。

image.png

上代码

题目1:初出茅庐

var userInfo = {
    name:"小明",
    age:11
}

function setNameFoo(obj){
    obj.name = '小红'
}
setNameFoo(userInfo)
console.log(userInfo.name) // 小红,这个好理解

image.png

题目2:渐入佳境

var userInfo = {
    name:"小明",
    age:11
}

function setNameFoo(obj){
    obj = {
        name:'小红',
        age:12
    }
}
setNameFoo(userInfo)
console.log(userInfo.name) // 小明 ?

image.png

二、分析

题目1的逻辑梳理

在 JavaScript 中,函数参数是按值传递的,但对于对象来说,传递的是对象的引用。此时 userInfo 和 obj 其实指向同一个内存地址。通过 obj.name = 'xxx' 这种方式,就会影响到 userInfo image.png

题目2的逻辑梳理

题目2中,重新创建了一个新的对象赋值给 obj,相当于给 obj 开辟了一个新的内存地址。此时,userInfo 和 obj 指向不同的内存地址。此时 ,通过 obj = {name:'xxx',age:'xxx'} 这种方式,不会影响 userInfo image.png

总结

在 JavaScript 中,函数参数是按值传递的,但对于对象来说,传递的是对象的引用。

  • 如果是通过 obj.name = 'xxx' 这种方式,就会影响到 userInfo
  • 如果是通过 obj = {name:'xxx',age:'xxx'} 这种方式,不会影响 userInfo