有没有办法区分这个
((a=true)=>{return a})(true)
这个?
((a=true)=>{return a})()
它们都返回true - 如何判断true是来自参数的默认值,还是来自传递给该参数的值?
答案 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);
};
}