先上结论,js函数传参传递的是参数的拷贝,请牢牢记住这句话。接下来我们看具体的例子。
基本数据类型
let a = 123
let foo = (num) => {
num = 456;
}
foo(a)
console.log(a);
很好理解,函数传入的是a的拷贝的值,所以a不会变化。
引用数据类型
let a = [1, 2, 3]
let foo = (obj) => {
obj[1] = 999
}
foo(a)
console.log(a);
a发生了变化,看起来传入的是a的地址指针,究竟是不是这样呢?我们再看一个例子。
let a = [1, 2, 3]
let foo = (obj) => {
obj[1] = 999
obj = [1, 1, 1]
obj[0] = 111
}
foo(a)
console.log(a);
我们发现,将obj指向一个新对象时,a就不变了。这很好的说明了文章开头的那句话,传参传递的都是拷贝。所以参数是引用数据类型时,传入的是该引用数据类型堆地址指针的拷贝,就是现在有两个指针指向该对象,之后我们将拷贝的指针指向一个新对象后,当然就影响不到原对象了。
记录记录!