Javascript 参数传递方式

三种参数传递方式

1. 值传递

将参数的值完全复制一份,按值传递。特征:对于传递过来的变量进行修改,不会影响到原变量。

2. 引用传递

对于参数的完全引用传递。特征:无论是对于变量成员的修改,还是对变量重新赋值,都会影响到原对象。例如:

// C++
#include "stdio.h"

class People {
public:
  int age;
  People(int age): age(age) {}
};

void fun(People& p) {
  p.age = 10;
  People p2(20);
  p = p2;
}

int main() {
  People p(5);
  fun(p);
  printf("%d", p.age); // 20
  return 0;
}

这里返回了20,说明 p = p2 改变了外部参数引用指向的地址,说明 C++ 是完全的引用传递。

3. 引用复制

将参数的地址复制一份,按值传递地址。特征:对于变量的成员进行修改时,会直接影响原变量;而如果对传递过来的变量进行重新赋值,则不会影响原变量,并且此后再修改变量的成员,也不会影响原变量。例如:

// javascript
function fun(p) {
  p.age = 10;
  p = { age: 20 };
}

let p = { age: 5 };
fun(p);
console.log(p.age); // 10

结论

所以 Javascript 的参数传递方式是

  1. 基本数据类型 -> 值传递
  2. 复杂数据类型 -> 引用复制 (也有书中写的是值传递,但含义相同)