JS ES6中()=>和_ =>和(_)=>之间的区别

时间:2019-05-02 05:45:38

标签: javascript ecmascript-6

我注意到,当我想编写粗箭头功能“ => ”时,我可以执行"_=>()=>,并且我的代码具有相同的功能(至少对于我的用例而言)

两者之间是否有实际区别?如果是,我应该使用哪个?我大多数时候一直在使用(_)=>,但是随后有一天,我看到某人使用()=>的代码,并认为它看起来很酷,所以我也开始使用它。

我看到了这篇https://medium.freecodecamp.org/when-and-why-you-should-use-es6-arrow-functions-and-when-you-shouldnt-3d851d7f0b26中等文章,作者在其中指出您可以使用_=>_=>,但没有指定是否有区别。

3 个答案:

答案 0 :(得分:11)

胖箭头函数的一般形式是

(parameter-list) => function-body

如果没有任何参数,请使用一对空括号:

() => {}

如果只有一个参数,则为:

(x) => {}

由于_是JavaScript中的有效标识符,因此您可以执行以下操作:

(_) => {}

现在,有一条特殊的规则适用:如果只有一个 参数,则可以跳过括号,这样您就可以得到:

_ => {}

请注意,这仅在您具有单个参数时才有效,即对于两个参数,您始终必须指定括号:

(x, y) => {}

现在,如果您的整个函数仅由带有return的单个语句组成,例如

x => { return x; }

您可以省略花括号和return

x => x

至少,如果在右侧您不尝试返回一个看起来像这样的对象(此代码无效!),则为true:

x => { value: x }

之所以不起作用,是因为JavaScript无法将其与函数主体(也使用花括号)区分开来,因此现在您必须将其包装在括号中:

x => ({ value: x })

我认为您几乎需要了解有关粗箭头功能语法的所有内容。

答案 1 :(得分:4)

您不应该仅仅因为它看起来很酷就使用它。

_通常用于告诉linter(或读者)您没有故意使用某个参数。

因此,如果您有一个带有两个参数的回调,而仅使用第二个参数,则您将编写(_, arg) => console.log(arg),因为如果您编写(foo, arg) => console.log(arg),则短绒棉将抱怨foo使用。

根据回调具有的参数数量,某些API的行为可能有所不同(expressjs的中间件就是一个示例),因此,如果API检查回调的length属性,则可能需要使用_之类的占位符。

var cb1 = _ => {};
var cb2 = () => {};

console.log(cb1.length)
console.log(cb2.length)

答案 2 :(得分:1)

箭头函数采用任意数量的参数,就像“常规”函数一样。如果没有参数,则用() => {}表示,类似于function() {}。但是,如果您有一个精确的参数,则可以省略括号。正如您所注意到的,这将导致类似于_ => {}的语法-这与(_) => {}相同,因为下划线是有效的标识符(就像foo一样。)

在特定情况下,运行时差异似乎没有,因为(大概)没有传递任何参数,在这种情况下_是未定义的。您可以轻松地验证这一点:

const foo = _ => console.log(_);
foo(5); // logs 5
foo(); // logs undefined

这并不是说您应该这样做,只是暂时不会有所作为。如果以后添加参数,可能会造成严重破坏。

相关问题