JavaScript传递参数

88 阅读2分钟

最近忙着找工作,大量刷算法对付大厂的笔试。

可是因为对函数传参的理解不够深刻,导致在刷算法的时候总是出错,然后调试半天不知道自己哪儿有问题,浪费了大量的时间。

我的需求很简单:传入一个指针,然后在函数内部修改指针的指向,让其指向一个新的数组。

于是我写了如下程序:

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> ]