逻辑或替代三元运算符

5

我有一个遗留脚本。以下是其中的一部分:

var e = e ? e : event;

所以,这里没有任何问题。但我主要使用三目运算符进行切换操作。它可以安全地重写为以下形式

var e = e || event;

有没有任何隐藏原因不使用这个?

4
我认为第一个更易读。 - Anirudh Ramanathan
我认为第二个更易读,而且上个月确实有过这样的争论(我会尽力找到它,但可能很难)。另外不要忘记最简单的 if (!e) e = event; - Kos
1
@Cthulhu 两个表达式都非常简单,因此可读性不应该是问题。看起来你不习惯使用 || 运算符。这种类型的检查通常会经常使用它。不过我建议放弃使用括号。 - Šime Vidas
1
“e”是当前函数的参数吗?如果是,则无需通过“var”声明具有相同名称的变量。 - Šime Vidas
@Kos if (!e) e = event; 是正确的做法。与 OP 的示例不同,这里仅在必要时才进行赋值操作。 - Šime Vidas
显示剩余2条评论
2个回答

7
在您的示例中,如果e不是falsy值,例如false,0,"",null,undefined,将使用e。否则将使用event。在您的情况下,这应该是安全的。
但是,使用更复杂的逻辑表达式而不是if-then-else(或三元运算符)存在一定的危险性。以下是一个示例:
result = value > 10 && getA() || getB()

如果保卫value > 10的结果为true,并且getA()返回一个falsy值,则将返回getB()。这与if-then-else的行为不同,后者将返回getA()falsy结果。

-1

第二个选项要小心,如果'e'不是false,它会将其分配给本地'e',否则,您将使用'event',但是,例如,如果'e'是"0",您希望本地'e'有什么? "0"还是'event'?因为在您的情况下,您的本地'e'最终仍将以'event'结束。


OP的代码意味着e应该持有对事件对象的引用。因此,它要么是一个对象值,要么是null/undefined,所以适当进行像e || event这样的检查。 - Šime Vidas
顺便提一下,不是任何东西,而是除了false之外的任何东西,包括undefined、null、空字符串、零或NaN。 - Šime Vidas
5
在第一种情况下同样会发生相同的事情。 - lorefnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接