使用链式布尔值或三元运算符进行变量重新分配
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);
澄清一下:
这纯粹是为了实验目的,学习一种新的(对我来说)语言的怪癖、零碎和结束。如果我要与其他任何人共享此代码,我当然会把它写成可读的。 :-)
我有一个函数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);