使用 && 作为 IF 语句的替代方案

8
我在查阅一些代码时发现了以下片段:

我在查阅一些代码时发现了以下片段:

"string" != typeof myVar && (myVar = "");

我理解这里发生的事情。如果myVar不是字符串,那么第一个条件会得到true,因此会评估第二个条件,导致myVar被设置为""。所以它本质上是以下内容的替代:
```javascript if (typeof myVar !== "string") { myVar = ""; } ```
if ("string" != typeof myVar)
    myVar = "";

这两种策略唯一可辨别的区别是前者也是一个返回语句,尽管我找到的代码没有使用返回值。所以我想知道:

  1. 这两种策略有什么优缺点吗?
  2. 如果第一种策略唯一的优点是能够返回一个值,那么我找到的代码是否被认为是糟糕的编程,因为它更难读懂?

7
我认为最大的问题就是可读性。查看 if 语句并找出正在发生的事情要容易得多。 - Jeff Shaver
1
如果你喜欢《星球大战》,Yoda代码总是很棒的,可以将字符串放在赋值之前的typeof检查前面等。 - adeneo
1
这看起来非常像被压缩的代码。你确定你正在阅读实际的源文件吗? - Bergi
我记得有一些压缩工具可以做到这一点,是的-它可以节省字符。 - Bergi
显示剩余3条评论
1个回答

5

只是想指出,这个习语有些用法不太清晰,而有些则非常清晰易懂。

"string" != typeof myVar && (myVar = "");

我读了这段代码,实际上不得不在脑海中将其转换为 if/else 语句。Steve McConnell 认为每行代码应该只做一件事情,我也同意他的观点,而这段代码明显违反了这个规则。此外,请注意嵌入式副作用本身就很危险,这段代码的问题还是相当明显的。
parameters = parameters || {};
var speed = parameters.speed || 60;

我认为IMO是一个更加清晰的用法,部分原因在于它是一个非常成熟的习语。或者。
if(x && x.employer && x.employer.company === 'google') 

这是成语的明显运用(例如,如果您执行undefined.company,将会收到一个异常)。


我想学习这个语法以及其他有用的缩短代码的方法,如何查找?请告诉我应该输入什么。 - marcinb1986

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