在js中,函数传递参数都是按值传递的,当在传递参数时,形参是一个局部变量,和实参互不影响,当参数是一个引用数据类型时,形参复制的是 实参的一份引用,所以当其改变时会影响外部实参,但并不意味着,是按引用传递的
基本类型
var num= 10
test(num)
function test(params){
params= 20 ----->改变
}
console.log(num) ------>外部变量num未发生变化
调用函数时,params局部变量得到 num复制的值,两个互不影响
引用类型
var testObj = new Object(null)
test(testObj)
function test(obj){
obj.name = '张三'
console.log('函数内部',obj.name) // 张三'
}
console.log(testObj.name) // 张三
调用函数时,形参 obj 获得 变量 testObj 的引用,因此在 形参 添加了 name属性,会影响到 外部变量 testObj ,但不意味着 是按引用传递
引用类型 测试2
var testObj = new Object(null)
test(testObj)
function test(obj){
obj.name = '张三'
obj = {
name:'复制一个新对象引用'
}
console.log('函数内部',obj.name) // 复制一个新对象引用'
}
console.log(testObj.name) // 张三
可以看到,当 对形参重新赋值一个引用时,并不会影响到 外部 变量
可以这样理解:
形参 obj 是复制的 实参 testObj 的引用。
且 obj是函数内的局部变量,当在其引用上操作时,会影响到外部实参
因为他们是同一份引用
但 当在函数内部重写 obj时,可以看到 在函数内部,obj的name属性是改变了的
但,外部确没有发现,因为 重写时 这个变量的引用就变成了一个局部对象
函数调用完就销毁了
综上:
函数传参是按值的,需要注意的是 在引用数据类型时,形参 得到的 实参的引用,所以,在改变 形参的属性时,会影响到 实参,但是,当重写 改写 形参时(重新赋值引用),此时 这个形参就变成了 局部对象,不会影响到外部,函数执行完后被销毁