最近,在看 《JS高程(第4版)》的 4.1.3 传递参数这一小节的时候,看着书上的内容,产生了一些困惑。
上代码
题目1:初出茅庐
var userInfo = {
name:"小明",
age:11
}
function setNameFoo(obj){
obj.name = '小红'
}
setNameFoo(userInfo)
console.log(userInfo.name) // 小红,这个好理解
题目2:渐入佳境
var userInfo = {
name:"小明",
age:11
}
function setNameFoo(obj){
obj = {
name:'小红',
age:12
}
}
setNameFoo(userInfo)
console.log(userInfo.name) // 小明 ?
二、分析
题目1的逻辑梳理
在 JavaScript 中,函数参数是按值传递的,但对于对象来说,传递的是对象的引用。此时 userInfo 和 obj 其实指向同一个内存地址。通过 obj.name = 'xxx' 这种方式,就会影响到 userInfo
题目2的逻辑梳理
题目2中,重新创建了一个新的对象赋值给 obj,相当于给 obj 开辟了一个新的内存地址。此时,userInfo 和 obj 指向不同的内存地址。此时 ,通过 obj = {name:'xxx',age:'xxx'} 这种方式,不会影响 userInfo
总结
在 JavaScript 中,函数参数是按值传递的,但对于对象来说,传递的是对象的引用。
- 如果是通过 obj.name = 'xxx' 这种方式,就会影响到 userInfo
- 如果是通过 obj = {name:'xxx',age:'xxx'} 这种方式,不会影响 userInfo