【问题标题】:How ternary operator calls a function?三元运算符如何调用函数?
【发布时间】:2021-09-30 20:31:45
【问题描述】:

给定以下代码:

const letters = ['a', 'b', 'c'];
foo = ((list, letter) => {
    if (list.includes(letter)) {
        return true;
    }
    return false;
})(letters, 'c') ? 'letter in list' : 'letter not in list';
console.log(foo);

输出将是:

letter in list

在这个例子中三元运算符是如何工作的?它是否以lettersc 作为参数调用foo?它怎么知道调用这个函数?

【问题讨论】:

  • (letters, 'c') 实际上是函数调用。结果比三元比较使用。
  • IIFE 的结果将返回一个布尔值,三元将打开。
  • 这是一个立即调用的函数表达式 (IIFE)。
  • "是否以字母和c为参数调用foo?" 不,它以lettersc为参数调用定义为(list, letter)的函数。这是[一个 IIFE](What is the (function() { } )() construct in JavaScript?)
  • @NiettheDarkAbsol 我同意这是糟糕的代码。但是,它可能只是为了展示 IIFE 而不会使其变得非常复杂。不过,它相当迟钝。

标签: javascript conditional-operator


【解决方案1】:

您可以将表达式拆分为几个部分,然后分别查看:

foo = (
    (
        // Create an arrow function
        (list, letter) => {
            if (list.includes(letter)) {
                return true;
            }
            return false;
        }
    )
    // call the function
    (letters, 'c')
) /* ternary operator on call result */ ? 'letter in list' : 'letter not in list';

如果不确定,通常可以用变量替换表达式以使其更清晰:

const func = (list, letter) => {
    if (list.includes(letter)) {
        return true;
    }
    return false;
};
const callResult = func(letters, 'c');
const foo = callResult ? 'letter in list' : 'letter not in list';

大多数人甚至会说它应该使用多个变量来提高可读性。

【讨论】:

  • 您可以通过删除条件并返回 return list.includes(letter) 来缩短 const func
  • @B001ᛦ 我注意到了。我专注于拆分现有代码,而不是简化它。毕竟,如果你不计算.includes,你甚至不需要在这里调用函数。
  • 我的座右铭是当你再次触摸它时优化代码;)
  • @B001ᛦ 我的偏好是在解释代码时尽可能少地修改它,因为它有助于找出差异所在。跟踪相似性很容易。解释list.includes("c") ? 'letter in list' : 'letter not in list' 与原始代码有何不同,作为解释几乎没有意义。这里的代码似乎是故意写成 simple 以突出一个特定的特性,即条件运算符中的嵌套表达式/IIFE。所以,它看起来像是训练代码。
猜你喜欢
  • 2022-11-03
  • 1970-01-01
  • 2014-01-19
  • 2020-04-30
  • 2019-07-30
  • 2018-12-04
  • 2014-05-17
  • 2016-01-02
  • 2016-11-21
相关资源
最近更新 更多