函数参数传递

在 JavaScript 中函数传参,分为两种:

  • 基础类型(Number、String、Boolean..)
  • 引用类型(Object、Array、Funcion..)

基础类型传参

看下面的例子:

let str = 0;
function log(prop) {
    prop = 1
    console.log(prop)
}
log(str)// 1
console.log(str)// 0
1
2
3
4
5
6
7

比较好理解,其实就是复制了一个值传入了函数中,复制的值修改了,原值不会修改。

引用类型传参

看例子:

let obj = { value: 0 }
function log(prop) {
    prop.value = 1
    console.log(prop)
}
log(obj)// { value: 1 }
console.log(obj)// { value: 1 }
1
2
3
4
5
6
7

给函数传了一个对象进去,然后在对象中修改属性的值,会导致原值的属性也被修改。 其实传入函数的是复制的一个对象的内存引用地址,修改对象的属性是通过复制的内存地址找到的这个对象,然后修改的是原对象上的属性。

如果将传过来的的引用地址在重新复制,是可以的:


let obj = { value: 0 }
function log(prop) {
    prop = { value: 1 }
    console.log(prop)
}
log(obj)// { value: 1 }
console.log(obj)// { value: 0 }
1
2
3
4
5
6
7
8

将复制的引用地址 重新赋值一个新的对象,则当前赋值的这个对象(1)和传进的对象(0)就毫无关系了。

总结

所以,对于函数的参数传递,普通类型传递的是值的副本,而引用类型传递的是引用地址的副本。

参考