对函数参数设置默认值,本质就是判断是否传入参数或者参数是否为空。
一般而言,最简单的就是下面的方法:
function example(name,age){
name=name||'貂蝉';
age=age||21;
alert('你好!我是'+name+',今年'+age+'岁。');
}
该函数也可以写作如下:
function example(name,age){
if(!name){name='貂蝉';}
if(!age){age=21;}
alert('你好!我是'+name+',今年'+age+'岁。');
}
或者
function example(a,b){
var a = arguments[0] ? arguments[0] : 1;//设置参数a的默认值为1
var b = arguments[1] ? arguments[1] : 2;//设置参数b的默认值为2
return a+b;
}
这个思路需要注意,是否需要区分 undefined, null 以及 其他可以转为 false 的值。
另一种思路,适合用于参数较多的情况。
可以使用 Object.assign 方法:
const object1 = {
a: 1,
b: 2,
c: 3
};
function abc(object1){
const object2 = Object.assign({c: 4, d: 5}, object1);
console.log(object2.a, object2.c, object2.d); // 1 3 5
}
但 Object.assgn 要注意兼容性问题。同时,也要注意,这个方法不能实现完全的深层复制,只能完成对对象第一层属性的覆盖,同时,如果值为显式赋值的 null
或者 undefined
,也能够用于覆盖原本的值:
const object1 = {
a: 1,
b: 2,
c: 3
};
function abc(object1){
object1.c = false;
object1.d = undefined;
const object2 = Object.assign({c: 4, d: 5}, object1);
console.log(object2.a, object2.c, object2.d); // 1 false undefined
}
也可以使用Jquery的扩展:
var object1 = {
a: 1,
b: 2,
c: 3
};
function example(setting){
var object1 = {
a: 1,
b: 2,
c: 3
};
$.extend(object1,settings);
}
$.extend 函数本身可以作为一个工具函数,处理对象的合并,语法
jQuery.extend([deep], target, object1, [objectN])
,这个函数会判断第一个参数是否是一个 Boolean 值(可选),如果是,则进行深拷贝,如果不是,则进行浅拷贝。然后根据除了 Boolean 值之外的其他参数的个数,判断是否是添加插件,如果剩余参数不止一个,则第一个作为 target,其他对象的属性将会复制到 target 上,而如果只有一个参数,则会将这个参数对象的方法添加到 jQuery 对象上,或者 jQuery.fn 上,根据调用函数的对象不同决定。
然后,es6 的函数提供了一种新的添加默认函数的方法:
function multiply(a, b = 1) {
return a*b;
}
multiply(5);
// 5
使用默认参数,在函数体的检查就不再需要了。
资料:
js中对函数设置默认参数值的3种方法
JavaScript 复制对象【Object.assign方法无法实现深复制】
MDN Object.assign()
JavaScript—函数参数:默认参数和剩余参数
jQuery 学习笔记:jQuery 代码结构