【问题标题】:Javascript parentheses around statements (not IIFE)语句周围的 Javascript 括号(不是 IIFE)
【发布时间】:2021-04-19 21:32:16
【问题描述】:

最近我学会了一个新的 JavaScript 技巧,但我并不完全理解。

我知道在使用胖箭头 / lambda 表达式时需要在对象周围放置 (),如下所示:

示例:

fetch(..).then((response) => ({ data: response } ))

但这怎么也行:

const text = (await fetch(...).then(response => response.text()))

因为如果你愿意

const text = await fetch(...)...

你显然得到了 [object Promise]。

很想知道为什么会这样。我一直在尝试用谷歌搜索这个,但只是偶然发现了 IIFE,但这就像 (..)();最后加上额外的 ()。

【问题讨论】:

  • 括号在那里没有做任何事情,它是等待。我通常建议不要将 async/await 与 .then/.catch 混合使用。
  • 如果您只有一个参数,则圆括号对于粗箭头表示法是可选的。 a => body(a) => body 是等价的。
  • @RaymondChen 他说的是对象周围的括号,这是防止对象被视为函数体所必需的。
  • a => { foo: bar} 不同于 a => ({foo: bar})

标签: javascript function parentheses


【解决方案1】:

(response) => ({data: response}) 将返回一个对象,其属性data 设置为响应对象。 response => response.text() 将返回一个承诺。就像评论一样,当箭头函数中使用单个参数时,括号是可选的。

【讨论】:

    【解决方案2】:

    括号中的:

    const text = (await fetch(...).then(response => response.text()));
    

    称为grouping operator,通常用于更改default precedence。文档使用了一个很好的例子:

    var a = 1;
    var b = 2;
    var c = 3;
    
    // default precedence
    a + b * c     // 7
    // evaluated by default like this
    a + (b * c)   // 7
    
    // now overriding precedence
    // addition before multiplication
    (a + b) * c   // 9
    
    // which is equivalent to
    a * c + b * c // 9
    

    但是,您可以在不需要它们时轻松使用它们。

    var a = 1;
    var a = (1);
    var a = ((1));
    

    上面的所有行都完全相同。回到您的代码,以下几行是等效的:

    var text = await fetch(...).then(response => response.text());
    var text = (await fetch(...).then(response => response.text()));
    

    它们确实在以下情况下有所作为:

    var text = await promise.toUpperCase();
    var text = (await promise).toUpperCase();
    

    第一行将在promise 上调用toUpperCase,然后awaittoUpperCase 的结果。由于 promise 没有 toUpperCase 方法,它会崩溃。

    第二行将首先await promise 结果,然后在结果值上调用toUpperCase。效果很好(假设 promise 解析为字符串)。

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 2011-06-13
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      相关资源
      最近更新 更多