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是来自参数的默认值,还是来自传递给该参数的值
- 是否可以从功能外部进行
- 是否可以从函数内部执行此操作
(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);
};
}