显然arguments.length不起作用。
我可以将签名更改为
f: (...args) => { if (args.length>0) { ..}; };
但这会从函数声明中删除参数信息。
还有更好的办法吗?
简短的回答是:“不”,或“也许”。
较长的答案是:来自 MDN :
与函数表达式相比,arrow function 表达式的语法更短,并且在词法上绑定 this 值(不绑定其自己的
、this
、arguments
或super
)。箭头函数始终是匿名的。这些函数表达式最适合非方法函数,并且不能用作构造函数。new.target
箭头函数的主要用途是回调,执行代码就像在其父上下文中执行一样。从而防止烦人且丑陋的
const that = this;
要求并隐式执行。
出于这个原因,并且由于它是匿名执行的,因此在父级上下文中,没有
arguments
,或者更确切地说,该值是父级上下文的。箭头函数只能解决一般用例,而不是所有用例。
// const that = this;
var that = this;
...
f: function (a, b, c) {
...
}
...
arguments
等)that
(或其他一些变量名称)而不是this
。that
参考...
f: (function (a, b, c) {
...
}).bind(this)
...
this
可用arguments
等)...
f: (...args) => {
const [a, b, c] = args;
...
}
g: (a, b, c, ...others) => {
...
}
...
arguments
实例您已经弄清楚了这一点,如果您使用箭头函数,扩展运算符 +
.length
将为您提供所需的信息。我认为您所呈现的特定用例(您需要保留参数信息并知道参数的长度)更适合非箭头函数:
f: function(a, b, c) { console.log(arguments.length); }
如果您使用箭头函数来保留父上下文,则始终可以将
.bind(this)
添加到末尾(并且会产生较小的性能损失)。
我不知道你到底需要完成什么,但如果你不想编写一个未知数量的函数,也许默认参数可以让你处理用户忘记所需参数的情况? ...或者您可以将参数打包在一个对象中并使用
Object.keys
来确定长度:
let f = (args) => console.log(Object.keys(args).length);
f({ a: 1, b: 2, c: 3 });
这将保留参数信息并允许您确定参数的长度。