我发现很难遵循此return语句的执行流程。如果有人能够解释它的执行流程是如何工作的,那么如果你能解释创建这样复杂的语句的优点和缺点,而不是更易读的多行语句,我会非常感兴趣。
return option = option ? option : {}, typeof option.xValue == "boolean" && (_ready = option.xValue), option.name && _ready == !1 && log(option.name + "(" + option.caller + " ) API not ready.", "E"), _ready
答案 0 :(得分:1)
该表达式使用逗号运算符执行多个语句,并使用&&
运算符作为if
表达式进行短路操作。
您可以将代码编写为:
if (!option) {
option = {};
}
if (typeof option.xValue == "boolean") {
_ready = option.xValue;
}
if (option.name && _ready == false) {
log(option.name + "(" + option.caller + " ) API not ready.", "E")
}
return _ready;
将其编写为单个复杂表达式的唯一优势是它是一个复杂的表达式。想要这样做的原因可能是让代码更难阅读,或者可能会稍微缩短代码。
答案 1 :(得分:0)
使用operator precedence table确定表达式中所有运算符的分组方式:
return
option =
option ? option : {},
typeof option.xValue == "boolean" &&
(_ready = option.xValue),
option.name &&
_ready == !1 &&
log(option.name + "(" + option.caller + " ) API not ready.", "E"),
_ready
分隔每个参数的逗号运算符计算每个表达式并返回最右边的表达式。首先,它执行option
任务。然后,它会评估每个&&
表达式,这些表达式可能会分配给_ready
或调用log()
。然后它最终返回_ready
。
我认为他实际上并不需要围绕_ready
任务的括号,他向我们扔了一块骨头。
写这么复杂的陈述没有实际的理由。这样做的人只是想表明他们有多聪明,恕我直言。请参阅Guffa的答案,重写为可理解的代码。