4

考虑以下示例代码:

1.样品

var IsAdminUser = (User.Privileges == AdminPrivileges)
  ? 'yes'
  : 'no';
console.log(IsAdminUser);

2.样品

var IsAdminUser = (User.Privileges == AdminPrivileges)?'yes': 'no';
console.log(IsAdminUser);

我对第二个示例非常满意,并且我以这种风格编写代码,但有人告诉我这是错误的做法,没有任何支持理由。

为什么不建议在 Node.js 中使用单行三元运算符?

任何人都可以解释为什么会这样吗?

提前感谢您的大力帮助。

4

5 回答 5

6

对于所有编码标准,它们通常是为了可读性和可维护性。我的猜测是作者发现它在单独的行中更具可读性。您的语言的编译器/解释器将完全一样地处理它。只要你/你的项目有一个固定的标准并坚持下去,你会没事的。我建议在项目中的每个人都对标准进行研究或至少对其进行审查,然后再将其固定下来。我认为如果你像这样在单独的行上分解它,你也可以定义一个 if/else 条件块并使用它。

警惕没有正当理由的编码标准规则。

就个人而言,我不喜欢三元运算符,因为它对我来说感觉不自然,而且我总是需要读几遍才能理解它在做什么。我发现单独的 if/else 块更容易阅读。当然是个人喜好。

于 2013-02-12T12:48:09.683 回答
5

?将 放在新行上实际上是错误的;即使它在实践中没有伤害。

原因是一个名为“<a href="http://www.ecma-international.org/ecma-262/7.0/index.html#sec-automatic-semicolon-insertion" rel="noreferrer">Automatic 的 JS 功能分号插入”。当var语句以换行符结尾时(没有尾随逗号,这表明要遵循更多声明),您的 JS 解释器自动插入分号。

该分号将具有IsAdminUser分配一个布尔值的效果(即 的结果User.Privileges == AdminPrivileges)。之后,一个新的(无效的)表达式将以您认为是三元运算符的问号开头。

如前所述,大多数 JS 解释器都足够聪明,可以识别出你不应该有一个换行符,并隐含地修复你的三元运算符。而且,在缩小脚本时,无论如何都会删除换行符。

因此,在实践中没有问题,但是您依赖于对常见 JS 引擎的隐式修复。最好像这样编写三元运算符:

var foo = bar ? "yes" : "no";

或者,对于更大的表达式:

var foo = bar ?
    "The operation was successful" : "The operation has failed.";

甚至:

var foo = bar ?
    "Congratulations, the operation was a total success!" :
    "Oh, no! The operation has horribly failed!";
于 2016-08-21T21:23:08.357 回答
3

我完全不同意提出这个建议的人。三元运算符是所有“C”风格语言(C、C++、Java、C#、Javascript 等)的标准功能,大多数使用这些语言编写代码的开发人员对单行版本完全满意。

第一个版本对我来说看起来很奇怪。如果我在维护代码并看到这一点,我会将其更正回一行。

如果您想要详细,请使用 if-else。如果您想要整洁紧凑,请使用三元组。

我的猜测是提出此建议的人对操作员不是很熟悉,因此感到困惑。

于 2017-07-27T06:40:28.430 回答
2

因为它更容易看,更容易阅读。一目了然地看到你的第一个片段在做什么要容易得多——我什至不必读到一行的末尾。我可以简单地看一个点,并立即知道IsAdminUser在什么条件下会有什么值。与为什么您不会在一行上编写整个 if/else 块的原因大致相同。

请记住,这些是风格约定,不一定有客观(或技术)推理的支持。

于 2013-02-12T12:49:43.897 回答
1

拥有的原因?和 : 在单独的行上是这样,如果您的源代码管理具有逐行比较,则更容易弄清楚发生了什么变化。

如果您刚刚更改了 ? 和 : 并且所有内容都在一行上,整行都可以标记为已更改(基于您的比较工具)。

于 2019-03-27T11:55:45.477 回答