Javascript 使用链式布尔或三元运算符重新分配变量
澄清:Javascript 使用链式布尔或三元运算符重新分配变量,javascript,conditional-operator,boolean-expression,Javascript,Conditional Operator,Boolean Expression,澄清: 这纯粹是为了实验目的,学习一门新语言(对我来说)的怪癖、零碎。如果我与其他人共享此代码,我当然会将其写得可读。:-) 我有一个函数someFunction(x),和两个全局变量: 设m=2; 设e=5; 在函数内部,我想检查x==m。如果这是真的,我想将m传递给一个side函数调用(sideFunction(m)),然后将x重新分配给e以完成someFunction const fn = x => (x == m && (sideFunction(m), x =
这纯粹是为了实验目的,学习一门新语言(对我来说)的怪癖、零碎。如果我与其他人共享此代码,我当然会将其写得可读。:-)
我有一个函数
someFunction(x)
,和两个全局变量:
设m=2;
设e=5;
在函数内部,我想检查x==m
。如果这是真的,我想将m
传递给一个side函数调用(sideFunction(m)
),然后将x
重新分配给e
以完成someFunction
const fn = x => (x == m && (sideFunction(m), x = e), doOtherStuffWith(x));
这确实按预期工作:
const someFunction=x=>{
如果(x==m){
副功能(m);
x=e;
}
dootherstuff(x);
}
不过,我想把它缩短,最好是一行。这也是为了进一步了解三元数和/或布尔链
我尝试过这两种方法:
//布尔链接
const someFunction=x=>{
x==m&&sideFunction(m)&&(function(){x=e})();
dootherstuff(x);
}
这不起作用,大概是因为赋值x=e
仅适用于内部匿名函数的局部范围内的x
//三元运算符
const someFunction=x=>{
x=(x==m&&sideFunction(m))?e:x;
dootherstuff(x);
}
这不起作用,大概是因为sideFunction(m)
由于某种原因实际上没有被调用
我如何修复这些问题以使其正常工作?或者,是否有其他优雅的方法来执行此检查/调用/重新分配,而无需完整的多行
if
块
多谢各位
x == m && sideFunction(m) && (function () {x = e})();
即&&
从左到右求值,并在找到第一个假值后立即停止。除非sideFunction
返回显式真实的内容,否则第三个生命:
(function () {x = e})()
将永远不会运行,导致永远不会重新分配x
x
在该函数中是本地的。如果您可以让函数运行,它将根据需要重新分配x
可以使用逗号运算符:
x == m && (sideFunction(m), x = e);
同样地
x = (x == m && sideFunction(m)) ? e : x;
将不起作用,因为sideFunction
必须为条件的左侧返回truthy值才能进行truthy计算-否则,x
将被分配给x
,没有更改
所有这些都说明了——我强烈建议不要做这些事情。第一种方法更具可读性,可读性比行守恒更重要。您可以使用带a的复合表达式,而不必关心
边函数的结果值
const fn = x => (x == m && (sideFunction(m), x = e), doOtherStuffWith(x));
逗号运算符,
可用于链接表达式并返回最后一个表达式,例如
var x=(1+2,10+2,100+2);
x;
//=> 102
我们可以使用它计算sideFunction(m)
并返回e
:(sideFunction(m),e)
由于您总是希望执行doOtherStuffWith
,因此只需确定是给它e
还是给它原始的x
:
constsomefunction=x=>doOtherStuffWith(x==m)(sideFunction(m,e):x);
sideFunction
返回什么?看起来像一个void函数,在这种情况下,它将计算为false
…“这不起作用,可能是因为赋值x=e只应用于内部匿名函数的局部范围内的x…?”或者可能是因为someFunction
返回一个falsy值。可能未定义
(如果它没有显式的返回
)。我看不出有什么必要缩短它。你试着看看它给你带来了什么——你在这个问题上花了多少时间和打字?它弥补了你可能保存的几个字符吗?保持简短:不要写这一行。@fredrik Woah,我甚至没有想到这一点。谢谢大家!@VLAZ我正在尝试学习语言是如何工作的。我决不会在生产环境中这样写它。:-)无论如何谢谢你!作为记录,这比OP的长度短四(4)个字符。如果我们不考虑连续空格。