【问题标题】:What is this JS syntax? Assignment in expression? (x != null && (y = x))这是什么JS语法?表达式赋值? (x != null && (y = x))
【发布时间】:2012-04-01 08:38:57
【问题描述】:

我正在使用这个 JS 插件,我遇到了一些我以前从未见过的语法。我明白它在做什么,但我不确定它为什么会起作用。

这是一个例子:

settings.maxId != null && (params.max_id = settings.maxId);

这只是利用条件和单个 = 吗?这是 JS 常用的语法吗?

【问题讨论】:

  • 嘿,这似乎是糟糕的代码 - (!=) 表示不相等并检查对象是否不为空,第二个条件 (=) 表示赋值 - 我想知道为什么在条件语句中使用它这个实例。干杯!
  • @Tats_innit:条件语句在哪里?此代码完全有效;这很愚蠢。
  • @LightnessRacesinOrbit 嗨,对不起,伙计,我假设 条件 因为它使用非空检查,如果我错了,谢谢和抱歉 - 很酷,所以不仅仅是我,它实际上是一个坏的那就声明吧!干杯
  • 我记得这种编码风格在 ANSI C 中很流行,用于读取文件:while (nextChar = file.readLine()),但我认为我没有见过它,因为它是一种出色的反模式。

标签: javascript syntax conditional


【解决方案1】:

此语句仅在 settings.maxId != null 时分配 params.max_id = settings.maxId,因为 && 是短路逻辑运算符

这种行为是由于 javascript 将评估条件直到它是必要的。因此,如果第一个条件为假,而第二个条件在 AND 中,则无需进一步检查

【讨论】:

    【解决方案2】:

    在 JavaScript 中,= 运算符是一个 表达式 并计算分配的值。因为它是一个表达式,它可以在任何允许使用表达式的地方使用即使它会导致副作用。 因此:

    settings.maxId != null && (params.max_id = settings.maxId)
    

    意思是:如果settings.maxId 不为空,那么(只有这样,因为&&short circuiting)计算右表达式(params.max_id = settings.maxId),这反过来会导致值的settings.maxId 分配给params.max_id。 这更清楚写成:

    if (settings.maxId != null) {
      params.max_id = settings.maxId
    }
    

    编码愉快。

    【讨论】:

      【解决方案3】:

      && 运算符称为“布尔AND”。通常,您会在 if 语句中看到它:

      if (x == true && y == false) {
      

      但这不是限制。根据逻辑“AND”运算,您可以在任何有效表达式中使用它来将其操作数的布尔值“组合”成一个布尔结果:

      var z = (x == true && y == false);
      // z is now true or false, accordingly
      

      && 的一个可爱之处在于它“短路”。在false && true 中,因为第一个操作数是false,所以整个表达式可能只计算为false,所以甚至不计算第二个操作数。

      让我们再检查一遍:

      var z = (false && foo());
      // z is now false
      

      在此语句中,函数foo 甚至从未被调用!不一定非要让程序知道z 将是false.

      这不仅仅是一种优化——您可以信赖它。

      一些愚蠢的人使用这种技术来重写条件语句:

      if (x == 0) {
         foo();
      }
      

      进入难以阅读的单个表达式:

      (x == 0) && foo();
      

      现在,考虑赋值可以是一个表达式,就像一个函数调用:

      var a = (b = c);
      

      或者:

      var a = (b = foo());
      

      并通过上述技术添加条件:

      var a = ((x == 0) && (b = foo()));
      

      现在,如果 x 不是 0,则根本不会计算整个表达式 b = foo(),因为短路。

      我们甚至不需要对&& 操作的结果做任何事情,如果我们不将它存储到a,你只剩下:

      (x == 0) && (b = foo());
      

      只有当x0 时,才会将b 分配给foo() 的值。

      避免它。很难阅读。只需使用if 语句即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-10-22
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        相关资源
        最近更新 更多