javascript默认参数指的是在函数定义时为参数预先设定的值,当函数调用时没有传入对应参数,或者传入的参数是undefined时,就会自动使用这个预设的默认值,避免参数缺失导致的逻辑错误。在ES6之前,javascript本身没有原生的默认参数语法,开发者需要手动通过逻辑判断实现默认值效果,ES6正式引入了默认参数特性,让参数默认值设置更加直观简洁。

ES6之前如何手动设置参数默认值
在ES6规范发布之前,开发者通常会通过逻辑或运算符或者条件判断来为函数参数设置默认值,常见的实现方式有以下几种。
使用逻辑或运算符设置默认值
逻辑或运算符会在左侧值为假值时返回右侧的值,因此可以利用这个特性设置默认值,不过这种方式有个缺陷,当传入的参数是0、空字符串、false等合法假值时,也会被替换为默认值。
// 使用逻辑或设置默认值
function add(a, b) {
// 当a是undefined、0、''等假值时,会使用10作为a的值
a = a || 10;
b = b || 20;
return a + b;
}
console.log(add()); // 30,a和b都使用默认值
console.log(add(5)); // 25,a使用5,b使用默认值20
console.log(add(0, 5)); // 30,这里0是假值,a被替换为10,结果不符合预期
使用条件判断设置默认值
为了避免逻辑或运算符的缺陷,可以通过判断参数是否等于undefined来设置默认值,这种方式可以正确处理0、空字符串等合法假值。
function add(a, b) {
if (a === undefined) {
a = 10;
}
if (b === undefined) {
b = 20;
}
return a + b;
}
console.log(add(0, 5)); // 5,0被正确识别为传入的参数,不会被替换
console.log(add()); // 30,使用默认值
ES6原生默认参数语法
ES6允许在函数定义时直接为参数指定默认值,语法是在参数后面用等号赋值,默认值的设置更加直观,也避免了手动判断的繁琐。
基本使用方式
直接在函数参数列表中为参数赋值即可设置默认值,当调用函数时没有传入该参数或者传入undefined时,就会使用默认值。
// ES6默认参数语法
function add(a = 10, b = 20) {
return a + b;
}
console.log(add()); // 30,a和b都使用默认值
console.log(add(5)); // 25,a使用5,b使用默认值20
console.log(add(0, 5)); // 5,0被正确识别为传入的参数
console.log(add(undefined, 30)); // 40,a使用默认值10
默认值可以是表达式
默认参数的值不一定是固定值,也可以是表达式,甚至可以是函数调用,表达式会在参数需要使用默认值时才会执行,也就是惰性求值。
// 默认值是函数调用的返回值
function getDefaultA() {
console.log('执行getDefaultA');
return 10;
}
function add(a = getDefaultA(), b = 20) {
return a + b;
}
console.log(add(5)); // 25,没有使用a的默认值,getDefaultA不会执行
console.log(add()); // 先输出执行getDefaultA,再输出30,a使用默认值,getDefaultA执行
默认参数可以引用其他参数
默认参数可以引用前面已经定义的参数,但是不能引用后面定义的参数,否则会报错。
function test(a = 10, b = a + 5) {
return a + b;
}
console.log(test()); // 25,a是10,b是10+5=15
console.log(test(5)); // 10,a是5,b是5+5=10
// 下面的代码会报错,b在a前面定义,不能引用a
// function test2(b = a + 5, a = 10) {
// return a + b;
// }
默认参数的注意事项
- 默认参数只有在传入undefined或者没有传入参数时才会生效,传入null时不会使用默认值,因为null是一个明确的赋值,不是undefined。
- 如果函数参数有默认值,函数内部的arguments对象不会跟随参数默认值变化,arguments还是保存调用时传入的实际参数。
- 默认参数会形成一个单独的作用域,在这个作用域里定义的变量不会影响到函数外部的作用域。
function test(a = 10) {
console.log(arguments.length); // 0,调用时没有传入参数
console.log(arguments[0]); // undefined,arguments没有保存默认值
}
test();
// 默认参数的单独作用域示例
let x = 1;
function outer(x = x + 1) { // 这里的x引用的是参数作用域的x,还没定义,会报错
return x;
}
// outer(); // 执行会报错,x is not defined
实际开发使用场景
默认参数在实际开发中非常实用,比如配置对象的默认值设置、可选参数的处理等场景都可以用到。
// 配置对象默认值设置
function createUser(options = {}) {
const defaultOptions = {
name: '默认用户',
age: 18,
gender: '未知'
};
// 合并传入的配置和默认配置
const finalOptions = { ...defaultOptions, ...options };
return finalOptions;
}
console.log(createUser()); // {name: '默认用户', age: 18, gender: '未知'}
console.log(createUser({ name: '张三', age: 20 })); // {name: '张三', age: 20, gender: '未知'}
javascript函数默认参数ES6参数默认值函数参数修改时间:2026-07-08 03:30:30