最近忙着找工作,大量刷算法对付大厂的笔试。
可是因为对函数传参的理解不够深刻,导致在刷算法的时候总是出错,然后调试半天不知道自己哪儿有问题,浪费了大量的时间。
我的需求很简单:传入一个指针,然后在函数内部修改指针的指向,让其指向一个新的数组。
于是我写了如下程序:
let a = null
function add(a){
a = new Array(10);
}
add(a);
console.log(a);
本以为打印的a是数组,结果是NULL,这是为什么呢?
这是JavaScript 中的函数参数传递的是值,而不是引用。这意味着在函数调用时,函数参数会创建一个新的变量,将原始值的副本传递给函数。因此,对函数参数的修改不会影响原始变量的值。
对于引用类型(如对象和数组)作为函数参数,虽然传递的是值,但这个值实际上是指向对象或数组的引用。因此,在函数中对引用类型参数的修改会影响原始对象或数组的值。**但是,如果在函数内部重新分配内存并将引用指向新的内存地址,原始引用不会受到影响。**sss
如图所示,执行函数时,实参a的值复制给实参a,此时形参和实参a都指向null。
但是分配内存后,形参a指向了一个新的区域。
如果要实现我的需求,通过函数改变a的指向,通常有三种方法。
方法一:可以让add() 函数返回一个新数组,然后将其赋值给全局变量 a。
let a = null;
function add() {
return new Array(10);
}
a = add();
console.log(a); // [ <10 empty items> ]
方法二:可以直接操作全局变量,而不是通过形参。
let a = null;
function add() {
a = new Array(10);
}
add();
console.log(a); // 输出:[ <10 empty items> ]
方法三:将变量和操作封装到一个类中
class ArrayManipulator {
constructor() {
this.array = null;
}
add(array) {
this.array = new Array(10);
}
print() {
console.log(this.array);
}
}
let obj = new ArrayManipulator();
obj.add(null);
obj.print(); // [ <10 empty items> ]