JS:参数问题

基本传参方式

位置参数(最常见)

按照参数顺序传递。

function add(a, b) {
  return a + b;
}

add(2, 3); // 5

特点:

  • 按顺序传
  • 少传参数 → undefined
  • 多传参数 → 多余参数被忽略

默认参数(Default Parameters)

ES6 新增,可以给参数默认值。

function greet(name = "Guest") {
  console.log("Hello " + name);
}

greet();       // Hello Guest
greet("Tom");  // Hello Tom

也可以使用表达式:

function calc(a, b = a * 2) {
  return a + b;
}

不定参数(Rest 参数)

... 收集多个参数。

function sum(...numbers) {
  return numbers.reduce((a, b) => a + b);
}

sum(1,2,3,4); // 10

特点:

  • numbers 是数组
  • 必须放在最后

对象/结构传参

对象参数(常用于配置)

用对象传参,避免顺序问题。

function createUser(options) {
  console.log(options.name);
  console.log(options.age);
}

createUser({
  name: "Tom",
  age: 18
});

优点:

  • 参数顺序无关
  • 可扩展性强

解构参数(Destructuring)

直接解构对象。

function createUser({name, age}) {
  console.log(name, age);
}

createUser({
  name: "Tom",
  age: 18
});

还可以带默认值:

function createUser({name = "Guest", age = 0}) {
}

数组解构参数

function print([a, b]) {
  console.log(a, b);
}

print([1, 2]);

回调函数传参

函数作为参数传递。

function process(callback) {
  callback("Hello");
}

process(function(msg){
  console.log(msg);
});

或者箭头函数:

process(msg => console.log(msg));

函数参数传递本质

JS 只有一种方式:按值传递(Pass by Value)

但对象的值是 引用地址

基本类型

let a = 1;

function change(x){
  x = 2;
}

change(a);

console.log(a); // 1 --- 不会改变原值。

引用类型

let obj = {a:1};

function change(o){
  o.a = 2;
}

change(obj);

console.log(obj.a); // 2 --- 因为传的是 引用地址的值。

实践案例

对象解构 + 默认参数

function list({
  pageSize = 10,
  pageCurrent = 1,
  keyword = ""
} = {}) {
  // ...
}

外层 = {} —— 整个参数的默认值,相当于下面的方式

function list(params = {}) {}
  • 如果函数调用 没有传参数,就默认用 {}

内层 = ... —— 解构默认值

  • 如果对象里没有这个字段,就使用默认值。

  • 例如:list({ pageSize: 20 });

    // 结果
    pageSize = 20
    pageCurrent = 1
    keyword = ""
    
function list({
  pageSize = 10,
  pageCurrent = 1,
  keyword = ""
} = {}) {
  console.log(pageSize, pageCurrent, keyword);
}

// 相当于 

function list(params) {

  params = params || {}; // 如果没传就取 {}

  const pageSize = params.pageSize ?? 10;c
  const pageCurrent = params.pageCurrent ?? 1;
  const keyword = params.keyword ?? "";

}

×

喜欢就点赞,疼爱就打赏