避免嵌套三元
Avoid nested ternary
我写的代码是这样的:
query = (type) ? (parent) ? { parent: parent } : { type: type } : {}
我不知道应该避免嵌套三元。但是正确编写它的简短方法是什么?
这似乎不是很短 - 我不知道这是否正确:
if (type && parent)
query = { parent: parent };
else if (type && !parent)
query = { type: type };
else
query = {};
第一个条件运算符 (?) 的两个表达式将是 (parent) ? { parent: parent } : { type: type }
和最后一个表达式 {}
.
的结果
它的工作方式是
var a = 1, b = 2;
console.log( a == 1 ? b == 2 ? 3 : 2 : 1 );//outputs 3
console.log( a == 2 ? b == 2 ? 3 : 2 : 1 );//outputs 1
console.log( a == 1 ? b == 1 ? 3 : 2 : 1 );//outputs 2
因此,首先评估 a==1
,然后进入第二个 b==2
。
所以,你需要做
if ( type )
{
if (parent)
{
query = { parent: parent };
}
else
{
query = { type: type };
}
}
else
{
query = {};
}
这个怎么样:
var query = {};
if (type){
if(parent){
query = {parent: parent};
}else{
query = {type: type};
}
}
嵌套的三元运算符通常可读性不强。你的例子相对简单。但是,当以不同方式嵌套运算符时,您必须 知道执行顺序才能正确理解它。例如(借自here):
a == b ? a : b ? c : d
您是否清楚这将如何执行?是吗
(a == b ? a : b) ? c : d
或
a == b ? a : (b ? c : d)
?在 JavaScript 中,三元运算符是 right associative,这意味着它的计算结果是后者。在某些编程语言中,三元运算符不是右结合的,而是左结合的。这表明嵌套三元运算符可能会造成混淆,因此应该避免或通过添加括号明确地完成。
如果您想要针对您的特定问题的专线,您可以使用:
var query = (type && parent && {parent:parent}) || (type && {type:type}) || {};
但是,我认为以下内容更具可读性:
var query = {};
if (type) {
query = parent ? { parent: parent } : { type: type };
}
我写的代码是这样的:
query = (type) ? (parent) ? { parent: parent } : { type: type } : {}
我不知道应该避免嵌套三元。但是正确编写它的简短方法是什么?
这似乎不是很短 - 我不知道这是否正确:
if (type && parent)
query = { parent: parent };
else if (type && !parent)
query = { type: type };
else
query = {};
第一个条件运算符 (?) 的两个表达式将是 (parent) ? { parent: parent } : { type: type }
和最后一个表达式 {}
.
它的工作方式是
var a = 1, b = 2;
console.log( a == 1 ? b == 2 ? 3 : 2 : 1 );//outputs 3
console.log( a == 2 ? b == 2 ? 3 : 2 : 1 );//outputs 1
console.log( a == 1 ? b == 1 ? 3 : 2 : 1 );//outputs 2
因此,首先评估 a==1
,然后进入第二个 b==2
。
所以,你需要做
if ( type )
{
if (parent)
{
query = { parent: parent };
}
else
{
query = { type: type };
}
}
else
{
query = {};
}
这个怎么样:
var query = {};
if (type){
if(parent){
query = {parent: parent};
}else{
query = {type: type};
}
}
嵌套的三元运算符通常可读性不强。你的例子相对简单。但是,当以不同方式嵌套运算符时,您必须 知道执行顺序才能正确理解它。例如(借自here):
a == b ? a : b ? c : d
您是否清楚这将如何执行?是吗
(a == b ? a : b) ? c : d
或
a == b ? a : (b ? c : d)
?在 JavaScript 中,三元运算符是 right associative,这意味着它的计算结果是后者。在某些编程语言中,三元运算符不是右结合的,而是左结合的。这表明嵌套三元运算符可能会造成混淆,因此应该避免或通过添加括号明确地完成。
如果您想要针对您的特定问题的专线,您可以使用:
var query = (type && parent && {parent:parent}) || (type && {type:type}) || {};
但是,我认为以下内容更具可读性:
var query = {};
if (type) {
query = parent ? { parent: parent } : { type: type };
}