functionaddSomeNumber(num) { return num + 100; } functionaddSomeNumber(num) { return num + 200; } console.log(addSomeNumber(0)); //200
可以通过检查参数的类型和数量,分别执行不同逻辑来模拟函数重载。
10.2.3 默认参数值
ECMAScript5.1以前设置默认参数值
简单粗暴 检测参数是否等于undefined,是的话就给它赋一个值
1 2 3 4 5 6
functionmakeKing(name) { name = (typeof name !== 'undefined') ? name : 'Henry'; return`King ${name} VIII`; } console.log(makeKing()); // King Henry VIII console.log(makeKing('Louis')); // King Louis VIII
ECMAScript6:支持=实现设置参数默认值
1 2 3 4 5
functionmakeKing(name = 'Henry') { return`King ${name} VIII`; } console.log(makeKing()); //King Henry VIII console.log(makeKing('Louis')); // King Louis VIII
通过传值为undefined的参数占位
1 2 3 4 5 6
functionmakeKing(name = 'Henry', numerals = 'VIII') { return`King ${name}${numerals}` } console.log(makeKing()); //King Henry VIII console.log(makeKing('Louis')); //King Louis VIII console.log(makeKing(undefined, 'VI')); //King Henry VI
arguments不反映参数的默认值
arguments始终以调用函数时传入的值为准, 所以修改命名参数也不会影响arguments对象
1 2 3 4 5 6
functionmakeKing(name = 'Henry') { name = 'Louis'; return`King ${arguments[0]}`; } console.log(makeKing()); //King undefined console.log(makeKing('Louis')); //King Louis
默认参数可以是原始类型或者引用类型
计算默认值的函数只有在调用函数并且未传相应参数时才会被调用
1 2 3 4 5 6 7 8 9 10 11 12
let romanNumerals = ['I', 'II', 'III', 'IV', 'V', 'VI']; let ordinalty = 0; functiongetNumerals() { return romanNumerals[ordinalty++]; } functionmakeKing(name = 'Henry', numerals = getNumerals()) { return`King ${name}${numerals}`; } console.log(makeKing()); //King Henry I console.log(makeKing('Louis', 'XVI')); //King Louis XVI console.log(makeKing()); //King Henry II console.log(makeKing()); //King Henry III
functionmakeKing(name = 'Henry', numerals = defaultNumers) { let defaultNumbers = 'VIII'; return`King ${name}${numerals}`; } console.log(makeKing()); //ReferenceError: defaultNumbers is not defined