解释以下复杂javascript返回语句的执行流程

解释以下复杂javascript返回语句的执行流程,javascript,Javascript,我发现很难遵循这个返回语句的执行流程。如果有人能解释它的执行流是如何工作的,如果你能解释创建这样复杂的语句的优缺点,而不是一个可读性更好的多行语句,我会非常感激 return option = option ? option : {}, typeof option.xValue == "boolean" && (_ready = option.xValue), option.name && _ready == !1 && log(option.na

我发现很难遵循这个返回语句的执行流程。如果有人能解释它的执行流是如何工作的,如果你能解释创建这样复杂的语句的优缺点,而不是一个可读性更好的多行语句,我会非常感激

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

表达式使用逗号运算符执行多个语句,而
&
运算符的短路操作作为
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;
将其作为单个复杂表达式编写的唯一优点是它是单个复杂表达式。这样做的原因可能是使代码更难阅读,或者可能是代码略短。

使用确定表达式中所有运算符的分组方式:

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
分隔每个参数的逗号运算符计算每个表达式并返回最右边的表达式。因此,它首先执行
选项
赋值。然后它计算每个
&
表达式,这些表达式可能分配给
\u ready
或调用
log()
。然后它最终返回
\u ready
的值

我不认为他真的需要在
\u ready
作业周围加上括号,他给了我们一根骨头


写这么复杂的声明没有实际的理由。伊姆霍,这样做的人只是想展示他们有多聪明。请参阅Guffa的答案,将其改写为可理解的代码。

明显的缺点:这很令人困惑。除非你想确保没有人愿意接受你的工作,然后维护你的程序,否则没有专业人士。说真的,这是一种错误做法。如果你真的需要做一条语句(不知道为什么,当你在一个函数中点击10条语句时,可能你的编辑器坏了?),那么至少把它放在几个缩进的行上,使它可读。我想读其他语句,因为我不明白在第一次交流后其他语句的范围可能会有所帮助。谢谢,那么| |运算符的短路是什么呢。在其他地方我发现了这个:me.myfunc(caller)| |(txt=“‘caller’argumat’不是字母数字,’,isOK=!1)
|
运算符计算第一个操作数,如果这是falsy,则计算第二个操作数。如果(!me.myfunc(caller)){txt='“caller”argumat不是字母数字的,;isOK=false;},您可以将其写成
。谢谢Barmar。你能解释一下| |在这样的陈述中做了什么吗。例如:
code
typeof option.xValue==“boolean”| | |(_ready=option.xValue),
code
操作符从左到右计算其参数,返回第一个真值。因此,如果
option.xValue
是布尔值,它将返回
true
,而不执行
\u ready
赋值。如果它不是布尔值,它将执行赋值。