默认参数值与 x in Object

90 阅读1分钟
      //   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