【问题标题】:Logical or instead of ternary逻辑或代替三进制
【发布时间】:2012-11-27 22:46:43
【问题描述】:

我有一个旧脚本。这是其中的一部分:

var e = e ? e : event;

所以,这里没有错。但我主要将三元用于工具。可以这样安全地重写吗

var e = e || event;

不使用这个有什么隐藏的原因吗?

【问题讨论】:

  • 我发现第一个更具可读性。
  • 我发现第二个更易读,上个月就发生了这个确切的争议(我会尝试找到它,但它会很难)。也别忘了最简单的if (!e) e = event;
  • @Cthulhu 这两个表达式都非常简单,因此这里的可读性不是问题。您似乎不习惯使用|| 运算符。它经常用于这些类型的检查。不过,我会放弃括号。
  • e是当前函数的参数吗?如果是,则无需通过var 声明具有相同名称的变量。
  • @Kos if (!e) e = event; 是要走的路。与 OP 的示例不同,此处仅在必要时进行分配。

标签: javascript ternary-operator logical-operators


【解决方案1】:

在您的示例中,如果 e 不是 falsy 值,则将使用它,例如 false, 0, "", null, undefined。否则将使用event。在你的情况下,这应该被保存。

但是使用更复杂的逻辑表达式而不是 if-then-else(或三元)存在一些危险。这是一个例子:

result = value > 10 && getA() || getB()

如果 guard value > 10 评估为 true AND getA() 返回 falsy 值,则将返回 getB()。这与 if-then-else 行为不同,后者将返回 getA()falsy 结果。

【讨论】:

    【解决方案2】:

    必须小心第二个选项,你基本上期望如果'e'不是假的,它会将它分配给你本地的'e',否则,你会使用'event',但是如果,例如,'e' 是“0”,你希望你的本地 'e' 有什么? “0”还是“事件”?因为在您的情况下,您本地的“e”无论如何都会以“事件”结束。

    【讨论】:

    • OP 的代码暗示e 应该持有对事件对象的引用。因此,它要么是 Object 值,要么是 null/undefined,因此适合进行 e || event 之类的检查。
    • 顺便说一句,除了 false 之外什么都没有,但除了 false、未定义、null、空字符串、零或 NaN 之外什么都没有。
    • 第一种情况也会发生同样的事情。
    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 2022-08-15
    • 1970-01-01
    • 2012-03-06
    • 2018-12-07
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多