【问题标题】:Javascript usage of && operator instead of if conditionJavascript 使用 && 运算符而不是 if 条件
【发布时间】:2020-05-14 01:39:13
【问题描述】:

这样的逻辑运算符有什么意义:r == 0 && (r = i);

function do()
{
    var r = 0;
    var i = 10;
    r == 0 && (r = i);
}

这是否与:

 if (r==0)
 {
     r=i;
 }

【问题讨论】:

  • 表达式比语句快
  • 可以转换成三进制r == 0 ? r = i : r = 10;
  • @Rajesh 1) 真的吗? 2) 速度快到足以证明这段代码晦涩难懂?
  • @Milan 如果你想要一个三元组,至少让它r = r == 0 ? i : 10...
  • “有这个逻辑运算符有什么意义...” 使单行代码为可读性付出了代价。一般来说,使用运算符来控制执行流程是不好的代码风格。它使代码更短但可读性更低。 BTW js minifiers 通常会为您执行此操作,而无需提前修改您的代码 :)

标签: javascript


【解决方案1】:

总是帮助我把它翻译成文字

  1. var r = 0;
  2. var i = 10;
  3. r == 0 && (r = i);

翻译成

  1. 将变量 r 设置为零
  2. 将变量 i 设置为 10
  3. 如果变量 r 等于 0 并且返回以下语句“将变量 r 设置为变量 i 的值”
  4. 什么都不做,但 r 现在是 10。

简而言之,让我们忘记 1 和 2。

在 javascript 中,布尔比较中的执行流程是如果 && 中的任何部分失败,则停止执行 if 语句参数。

布尔比较器将从左到右执行。

1 == 1 && 2 == 3 && (r = i)

它将通过 1 == 1 失败 2 == 3 并且永远不会到达分配操作。

基本上它是以下的简写:

if(r == 0) {
   r = i;
}

【讨论】:

    【解决方案2】:

    简单是r == 0 && (r = i);是一样的

    if (r==0)
     {
         r=i;
     }
    

    【讨论】:

      【解决方案3】:

      在逻辑和控制流方面是相同的。

      它通过 (ab) 使用 short-circuit 行为来缩短代码行 (code golf)。
      代码高尔夫的 StackExchange 页面是 https://codegolf.stackexchange.com

      对于更短的代码,您可以使用逻辑 OR 作为默认运算符。

      r = r || i;
      

      或者

      r || (r = i);
      

      【讨论】:

      • 问题的目的是了解在条件语句上使用表达式的目的
      • 什么?为一个完全有用的答案投了三票?
      • @RobbyCornelissen 否决票是因为这是另一种表达方式,但这不是 OP 想要的。问题是为什么要使用表达式而不是条件语句
      【解决方案4】:

      确实是一样的,并且是压缩器经常使用的一种技术来折叠代码。在这种情况下,您甚至可以使用 !为了在没有类型检查的情况下进行比较:

      !r && (r = i);
      

      或者使用 ||此分配的运算符:

      r = r || i;
      

      如果您想保持代码清晰,请使用 if tho。

      【讨论】:

      • 不起作用:!r && r = i; 产生:Invalid left-hand side in assignment
      【解决方案5】:

      Just tested the speed of the code 和 && 快一点(几乎可以忽略不计)。

      谈到实际问题,我找到了使用 && 而不是 if 我们字面意思是后来的简写代码的地方。但是从不使用代码,因为它会严重影响代码阅读器的可读性。

      正如docs 所说的

      逻辑运算符通常与布尔(逻辑)值一起使用。当它们存在时,它们返回一个布尔值。

      但是我们在这里看到的是基于 other 对 a 变量的赋值。当然代码有效,但我相信,这只是对约定的误用。

      【讨论】:

      • 不确定它会产生多大的差异,但即使我尝试了jsperf,也几乎没有区别
      • @Rajesh 是的。这是我的测试用例:jsperf.com/operators-and-if/1
      • 是的,在您的回答中看到了。尽管即使我假设相同,但几乎没有区别。当我运行你的链接时,它给了我完全相同的细节.. :-p
      • 测试缺少r 的另一个值,它可能与零不同。也许你用另一个值来测试一半的测试......
      【解决方案6】:

      假设您只有在 r=0 和 i=10 时才打印一些内容。然后 && 将使用 full like。

      if(r==0 && i==10){
         console.log('its good practice')
      }
      

      如果我们使用单独的,比如

      if(r==0){
         if(i==10){
           console.log('its bad practice')
         }
      }
      

      如果你有很多条件要检查,你会怎么做。?我建议你使用第一个。

      【讨论】:

      • 你的回答完全没有抓住问题的重点,那就是:“那些是等价的,为什么有人会选择表达式而不是 if 语句”
      猜你喜欢
      • 2012-12-05
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2022-08-02
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多