// function foo(x, y) {
// x = x || 11;
// y = y || 31;
// console.log(x + y);
// }
// 当你想把0传进去的时候发现被||卡住了
// 这时候可以通过判断是否存在参数中来确认传的值是否可以省略
function foo(x, y) {
x = 0 in arguments ? x : 11;
y = 1 in arguments ? y : 31;
console.log(x + y);
}
foo(5, undefined);// NaN
foo(5) // 36
一个知识点:x in Object , 这里的x可以是字符串或数组的索引,所以0 in arguments=> true
赋予默认参数的一个问题
function foo(x = 11, y = 31) {
console.log(x + y);
}
foo(5);
foo(5, undefined); // 36 丢了undefined
foo(5, null); // 5 null被强制转换为0
foo(undefined, 6); //17 丢了undefined
foo(null, 6); //6 null被强制转换为0
函数中生命的 x=11 更像是 x !== undefined ? x : 11而不是常见的 x||11,所以转换成默认值语法的时候一定要注意。
null转换成number类型为0;undefined转换为number类型为NaN
函数默认值不光可以是简单值,还可以是任意合法表达式,甚至可以是函数调用
function bar(val) {
console.log('bar called')
return y + val
}
function foo(x = y + 3, z = bar(x)) {
console.log(x, z)
}
var y = 5;
foo(10); // 10 15
foo(undefined, 10); // 8 10