本文详解在JavaScript中实现默认参数的三种方案。首先介绍现代语法中的直接声明方式,接着针对旧版环境提供手动判断undefined的兼容写法,最后推荐利用对象合并库(如Underscore.js的extend方法)处理多参数默认值,确保代码简洁且具备向后兼容性。
JavaScript默认参数概述
部分编程语言如Ruby、CoffeeScript以及未来的JavaScript标准,允许在定义函数时直接声明默认参数,示例如下:
代码如下:
function myFunc(param1, param2 = "second string") {
console.log(param1, param2);
}
// 输出:"first string" 和 "second string"
myFunc("first string");
// 输出:"first string" 和 "second string version 2"
myFunc("first string", "second string version 2");
手动判断undefined的兼容方案
然而,在当前的JavaScript版本中,这种语法写法无效。因此,我们需要利用现有工具集来实现类似功能。
最简单的解决方案如下所示:
代码如下:
function myFunc(param1, param2) {
if (param2 === undefined) {
param2 = "second string";
}
console.log(param1, param2);
}
// 输出:"first string" 和 "second string version 2"
myFunc("first string", "second string version 2");
事实上,被省略的参数在访问时始终为“undefined”。如果仅有一个参数,这是良好的解决方式;但如果存在多个参数,该如何处理?
使用对象合并处理多参数
当参数数量超过一个时,可以使用对象作为参数传入,这样每个参数都有明确的命名。若传递对象参数,可采用相同方式声明默认值。
代码如下:
function myFunc(paramObject) {
var defaultParams = {
param1: "first string",
param2: "second string",
param3: "third string"
};
var finalParams = defaultParams;
// 遍历paramObject的每个属性
for (var key in paramObject) {
// 如果当前属性不是继承的,则继续
if (paramObject.hasOwnProperty(key)) {
// 如果当前属性已定义,
// 将其添加到finalParams
if (paramObject[key] !== undefined) {
finalParams[key] = paramObject[key];
}
}
}
console.log(finalParams.param1,
finalParams.param2,
finalParams.param3);
}
myFunc({param1: "My own string"});
这种方式略显笨拙,如果多处使用,可以封装一个函数。幸运的是,许多库已提供相关方法,例如jQuery和Underscore中的extend方法。
下面使用Underscore的extend方法实现上述相同结果:
代码如下:
function myFunc(paramObject) {
var defaultParams = {
param1: "first string",
param2: "second string",
param3: "third string"
};
var finalParams = _.extend(defaultParams, paramObject);
console.log(finalParams.param1,
finalParams.param2,
finalParams.param3);
}
// 输出:
// "My own string" 和 "second string" 和 "third string"
myFunc({param1: "My own string"});
这就是在当前JavaScript版本中实现默认参数的方法。
文中如有不妥之处,欢迎批评指正。