代码应该是可读的,所以简洁并不意味着不惜一切代价保持简洁——因为你应该重新发布到https://codegolf.stackexchange.com/——所以我建议使用第二个名为index的局部变量来最大限度地提高阅读的可理解性(我注意到,运行时成本也最低):
var index = someArray.indexOf( 3 );
var value = index == -1 ? 0 : index;
但如果你真的想减少这种表达,因为你对你的同事或项目合作者是一个残忍的虐待狂,那么你可以使用以下 4 种方法:
1:var 语句中的临时变量
您可以使用var 语句的功能来定义(和分配)第二个临时变量index(用逗号分隔):
var index = someArray.indexOf(3), value = index !== -1 ? index: 0;
2:自执行匿名函数
另一种选择是自执行匿名函数:
// Traditional syntax:
var value = function( x ) { return x !== -1 ? x : 0 }( someArray.indexOf(3) );
// ES6 syntax:
var value = ( x => x !== -1 ? x : 0 )( someArray.indexOf(3) );
3:逗号运算符
还有 JavaScript 支持的臭名昭著的“逗号运算符”,它也存在于 C 和 C++ 中。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
当您想在需要单个表达式的位置包含多个表达式时,可以使用逗号运算符。
您可以使用它来引入副作用,在这种情况下通过重新分配给value:
var value = ( value = someArray.indexOf(3), value !== -1 ? value : 0 );
这是因为var value首先被解释(因为它是一个语句),然后最左边,最里面的value赋值,然后是逗号的右边运算符,然后是三元运算符 - 所有合法的 JavaScript。
4:在子表达式中重新赋值
评论员@IllusiveBrian 指出,如果将value 的赋值用作带括号的子表达式,则不需要使用逗号运算符(在前面的示例中):
var value = ( ( value = someArray.indexOf(3) ) !== -1 ? value : 0 );
请注意,在逻辑表达式中使用否定词对人类来说可能更难理解 - 因此可以通过将idx !== -1 ? x : y 更改为idx == -1 ? y : x 来简化上述所有示例以方便阅读:
var value = ( ( value = someArray.indexOf(3) ) == -1 ? 0 : value );