函数参数传递
在 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
比较好理解,其实就是复制了一个值传入了函数中,复制的值修改了,原值不会修改。
引用类型传参
看例子:
let obj = { value: 0 }
function log(prop) {
prop.value = 1
console.log(prop)
}
log(obj)// { value: 1 }
console.log(obj)// { value: 1 }
给函数传了一个对象进去,然后在对象中修改属性的值,会导致原值的属性也被修改。 其实传入函数的是复制的一个对象的内存引用地址,修改对象的属性是通过复制的内存地址找到的这个对象,然后修改的是原对象上的属性。
如果将传过来的的引用地址在重新复制,是可以的:
let obj = { value: 0 }
function log(prop) {
prop = { value: 1 }
console.log(prop)
}
log(obj)// { value: 1 }
console.log(obj)// { value: 0 }
将复制的引用地址 重新赋值一个新的对象,则当前赋值的这个对象(1)和传进的对象(0)就毫无关系了。
总结
所以,对于函数的参数传递,普通类型传递的是值的副本,而引用类型传递的是引用地址的副本。