使用链式布尔值或三元运算符进行变量重新分配

Variable reassignment with chained booleans or ternary operator

澄清一下:
这纯粹是为了实验目的,学习一种新的(对我来说)语言的怪癖、零碎和结束。如果我要与其他任何人共享此代码,我当然会把它写成可读的。 :-)


我有一个函数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);
}

不过,我想缩短它,最好是一行。这也是为了更多地了解三元组 and/or 布尔链接。

我试过这两种方法:

// 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);
}

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

我怎样才能解决这些问题以使其正常工作?
或者,是否有其他优雅的方法来执行此 check/call/reassignment 而无需完整的多行 if 块?

非常感谢!

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

&&从左到右求值,找到第一个假值就停止。除非 sideFunction return 明确为真,否则第三个 IIFE:

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

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

x 在该函数中是局部的。如果您可以将函数获取到 运行,它将根据需要重新分配 x

您可以使用逗号运算符:

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

同样

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

不会工作,因为 sideFunction 必须 return 条件左侧的真实值才能真实地评估 - 否则,x 将被分配给 x, 没有变化。


综上所述 - 我强烈建议您不要执行任何这些操作。您的第一种方法更具可读性,可读性比行守恒重要得多。

您可以采用带有 comma operator 的复合表达式,而不关心 sideFunction.

的结果值
const fn = x => (x == m && (sideFunction(m), x = e), doOtherStuffWith(x));

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

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

我们可以用它来计算sideFunction(m)和returne(sideFunction(m), e).

既然一直要执行doOtherStuffWith那么只需要搞清楚是给e还是原来的x:

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