javascript参数是默认的吗?

时间:2017-03-28 23:43:10

标签: javascript ecmascript-6 arguments

有没有办法区分这个

((a=true)=>{return a})(true)

这个?

((a=true)=>{return a})()

它们都返回true - 如何判断true是来自参数的默认值,还是来自传递给该参数的值?

  • 是否可以从外部功能?
  • 是否可以从内部功能?

4 个答案:

答案 0 :(得分:1)

  

有没有办法说出这两者之间的区别?

没有。箭头函数不支持参数对象,因此无法检查它。

但是,如果您使用的是非箭头函数,则可以从函数内部获取参数编号。例如:

(function(a=true){return arguments.length;})(); // 0
(function(a=true){return arguments.length;})(true); // 1

您可以轻松找出如何将其扩展为多个参数。

答案 1 :(得分:0)

你无法区分你的具体例子,并且没有办法从外面告诉你这个功能。唯一公开的信息是您使用返回值显式公开的信息,它只是布尔值。

里面这个函数,你可以分辨出你是否重写逻辑。您可以从

更改您的功能
((a=true)=>{
  return a;
})(true)

((...args)=>{
  const a = args[0] === undefined ? true : args[0];

  if (args.length > 0) console.log("passed arg");
  else console.log("passed no arg");

  return a;
})(true)

请注意,您无法将其与默认值语法结合使用,因此如果您必须重写它以使用rest语法。

或者,您可以使用普通函数而不是箭头,并使用arguments,但如果您的真实案例依赖于箭头函数的词汇this,那么这也是一个潜在的难以改变。 e.g。

(function(a = true)=>{
  if (arguments.length > 0) console.log("passed arg");
  else console.log("passed no arg");

  return a;
})(true)

答案 2 :(得分:0)

虽然在各方面都不理想,但一种解决方案可能是:

(a=undefined) => {
  let is_default = false; 
  if (a === undefined) {
    is_default = true;
    a = true;
  } 

  return a
}

答案 3 :(得分:0)

如果你真的想使用箭头功能,你可以使用Symbol和包装IIFE

来获得稳健(如果是错综复杂的)结果
var fn = ((def) => 
    (a = def) => {
        if(a === def) {
            console.log('defaulted');
            a = true;
        }
        console.log('a is', a);
    }
)(Symbol());

fn()fn(true)都会产生a is true - 但是,fn()也会输出defaulted,然后设置a = true - 尽管如此最后一步我猜不必做,取决于你真正希望“检测”这个真正功能的真实内容

或者,正如@Bergi指出的更好的方法(我一直忘记ES6 +中的块范围:D)

var fn; 
{ 
    const def = Symbol(); 
    fn = (a=def) => {
        if(a === def) {
            console.log('defaulted');
            a = true;
        }
        console.log('a is', a);
    }; 
}