javascript参数是否默认?

javascript参数是否默认?,javascript,ecmascript-6,arguments,Javascript,Ecmascript 6,Arguments,有没有办法区分这两者之间的区别 ((a=true)=>{return a})(true) 这个呢 ((a=true)=>{return a})() 它们都返回true-我如何判断该true是来自参数的默认值,还是来自传递给该参数的值 是否可以从功能外部进行 是否可以从函数内部执行此操作 有没有办法区分这两者的区别 不支持。Arrow函数不支持参数对象,因此无法对此进行检查 但是,如果您使用的是非箭头函数,则可以从函数内部获取参数编号。例如: (function(a=true)

有没有办法区分这两者之间的区别

((a=true)=>{return a})(true)
这个呢

((a=true)=>{return a})()
它们都返回true-我如何判断该true是来自参数的默认值,还是来自传递给该参数的值

  • 是否可以从功能外部进行
  • 是否可以从函数内部执行此操作
有没有办法区分这两者的区别

不支持。Arrow函数不支持参数对象,因此无法对此进行检查

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

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

您可以很容易地找到如何将其扩展到多个参数。

您无法在特定示例中区分不同,也无法从函数外部明确区分。唯一公开的信息是使用返回值显式公开的信息,返回值只是布尔值

从函数内部,如果重写逻辑,就可以看出不同之处。您可以从

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

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

或者,您可以使用普通函数而不是箭头,并使用
参数
,但是,如果您的实际案例依赖于箭头函数的词法
this
,则这也是一个潜在的困难更改。e、 g

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

  return a;
})(true)

尽管并非在所有方面都很理想,但一种解决方案可能是:

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

  return a
}

如果您真的想使用箭头函数,您可以使用
符号和包装iLife实现健壮的(如果是卷积的)结果

var fn = ((def) => 
    (a = def) => {
        if(a === def) {
            console.log('defaulted');
            a = true;
        }
        console.log('a is', a);
    }
)(Symbol());
fn()
fn(true)
都将导致
a为true
-然而,
fn()
也将输出
默认值
,然后设置
a=true
-虽然我猜最后一步不必做,但这取决于您真正想“检测”的实际函数的实际内容

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


如果使用“常规”函数而不是箭头函数,您可以检查
参数。在严格模式函数中使用
参数时,length
是完全有效的。@FREE_和_OPEN_SOURCE但访问
。length
类似于JaromandaX的建议,在严格模式下是可以的。@FREE_和_OPEN_SOURCE-
参数。length
在“严格模式”下是完全有效的,所以提到它的不可用性通常是错误的,当您需要区分这些情况时,不应该使用默认值。什么是您的?值得一提的是,在
严格模式下访问
参数.length
是完全有效的。好的,更新了。但我的意思是,利用
参数
对象的属性有时可能会暴露一些可能性,比如读取当前正在执行的函数的源代码或类似的东西。无论如何,我同意,我不认为这会对找到那个特定问题的答案产生什么影响。主要的缺点是,如果你传递了一个参数,但该值是未定义的,那么这个问题就不适用了。默认值
undefined
是毫无用处的,因为这是默认值。(唯一的区别是函数的算术性)是的,对于纯JS来说没有什么区别。我这样做有两个原因,一个原因是它显然有一个默认意图,并且为了某种类型推断检查的好处而不是
arguments.length>0
我会检查
arguments[0]!==未定义的
由于默认初始化器使用的是未定义的
,因此我假设问题是检测到正在传递的arg的存在,因此即使用户执行了
foo(未定义)
,它也应该计算在内。但是有一点不清楚,
var-fn;{const def=Symbol();fn=(a=def)=>{…};}
var fn = ((def) => 
    (a = def) => {
        if(a === def) {
            console.log('defaulted');
            a = true;
        }
        console.log('a is', a);
    }
)(Symbol());
var fn; 
{ 
    const def = Symbol(); 
    fn = (a=def) => {
        if(a === def) {
            console.log('defaulted');
            a = true;
        }
        console.log('a is', a);
    }; 
}