【问题标题】:Variable reassignment with chained booleans or ternary operator [closed]使用链式布尔值或三元运算符重新分配变量[关闭]
【发布时间】:2021-01-10 20:44:45
【问题描述】:

澄清一下:
这纯粹是为了实验目的,学习一种新的(对我而言)语言的怪癖、奇点和结局。如果我要与其他人共享此代码,我当然会写出可读性。 :-)


我有一个函数someFunction(x),还有两个全局变量:

let m = 2;
let e = 5;

在函数内部,我想检查x == m。如果这是真的,我想将m 传递给辅助函数调用(sideFunction(m)),然后将x 重新分配给e 以完成someFunction

确实按预期工作:

const someFunction = x => {
    if (x == m) {
        sideFunction(m);
        x = e;
    }
    doOtherStuffWith(x);
}

但是,我想缩短它,最好是一行。这也是为了更多地了解三元和/或布尔链。

这两种方法我都试过了:

// Boolean chaining
const someFunction = x => {
    x == m && sideFunction(m) && (function () {x = e})();
    doOtherStuffWith(x);
}

起作用,大概是因为赋值x = e 仅适用于内部匿名函数的本地范围内的x...?

// Ternary operator
const someFunction = x => {
    x = (x == m && sideFunction(m)) ? e : x;
    doOtherStuffWith(x);
}

工作,大概是因为sideFunction(m)实际上并没有被调用,出于某种原因...?

如何解决这些问题以使其正常工作?
或者,是否有其他优雅的方法可以在没有完整的多行 if 块的情况下执行此检查/调用/重新分配?

非常感谢!

【问题讨论】:

  • sideFunction 返回什么?看起来像一个 void 函数,在这种情况下,它将评估为 false...
  • "这不起作用,大概是因为赋值 x = e 只适用于内部匿名函数的局部范围内的 x...?" 或者大概是因为someFunction 返回一个虚假值。可能是undefined(如果它没有明确的return)。我看不出有什么必要缩短它。你试着看看它给你带来了什么——你在这个问题上花了多少时间和打字?它是否弥补了您可能保存的几个字符?
  • 保持简短:不要写这一行。
  • @fredrik 哇,我什至没有想到这一点。谢谢!
  • @VLAZ 我正在尝试学习该语言的工作原理。我永远不会在生产环境中这样写。 :-) 还是谢谢你!

标签: javascript conditional-operator boolean-expression


【解决方案1】:

问题

x == m && sideFunction(m) && (function () {x = e})();

&& 是从左到右计算的,一旦找到第一个错误值就会停止。除非 sideFunction 返回明确真实的内容,否则第三个 IIFE:

(function () {x = e})()

永远不会运行,导致x 永远不会被重新分配。

x 在该函数中是本地的。如果您可以运行该函数,它将根据需要重新分配x

您可以使用逗号运算符:

x == m && (sideFunction(m), x = e);

同样

x = (x == m && sideFunction(m)) ? e : x;

不会起作用,因为 sideFunction 必须返回一些真实的东西,以便条件的左侧进行真实评估 - 否则,x 将被分配给 x,没有变化。


所有这一切 - 我强烈建议不要做任何这些。您的第一种方法更具可读性,并且可读性比行保存更重要。

【讨论】:

    【解决方案2】:

    您可以使用带有comma operator 的复合表达式,而不关心sideFunction 的结果值。

    const fn = x => (x == m && (sideFunction(m), x = e), doOtherStuffWith(x));
    

    【讨论】:

    • 为了记录,这比 OP 的字符短四 (4) 个字符。如果我们折扣连续的空白。
    【解决方案3】:

    逗号运算符, 可用于链接表达式并返回最后一个,例如,

    var x = (1 + 2, 10 + 2, 100 + 2);
    x;
    //=> 102
    

    我们可以用它来评估sideFunction(m)并返回e(sideFunction(m), e)

    既然你总是想执行doOtherStuffWith,你只需要弄清楚是给它e还是原来的x

    const someFunction = x => doOtherStuffWith(x == m ? (sideFunction(m), e) : x);
    

    【讨论】:

      猜你喜欢
      • 2011-06-06
      • 2013-02-07
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2021-07-14
      • 2016-03-30
      相关资源
      最近更新 更多