基本传参方式
位置参数(最常见)
按照参数顺序传递。
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 ?? "";
}