逗号分隔的表达式可以在Javascript中用作if语句吗?

时间:2015-02-10 22:48:32

标签: javascript expression comma

我正在尝试理解那些大量使用逗号分隔表达式的脚本。例如:

popup_window != is_null && ("function" == typeof popup_window.close && popup_window.close(), popup_window = is_null);

如果逗号分离的意思是“评估所有以下表达式,然后生成最终表达式的值”(如this SO answer中所示),这是if语句的另一种形式吗?

像:
“如果popup_window不为null并且popup_window.close是一个方法,则调用此方法并将popup_window设置为null”

无论如何,我不确定我理解语法。

问题
这句话意味着什么,逗号分离是什么?这应该是if语句吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

这是一系列陈述

popup_window != is_null // if true, continue to the statement in the parenthesis
    && 
(
    "function" == typeof popup_window.close // if true continue to close the window
      && 
    popup_window.close()
    , popup_window = is_null // this is executed as long as "popup_window != is_null" 
);                           // is truthy, it doesn't depend on the other conditions

假设is_null确实是null,首先popup_window不能为空。
其次,我们可以假设popup_window是另一个窗口,用window.open打开,因为它应该具有close函数,并且它有点像Yoda条件,但它也可以是写入

typeof popup_window.close === "function"

所以popup_window必须有close方法才能继续下一步。 最后一步关闭弹出窗口,如果它不为null,并且它有一个close方法。

popup_window.close()

所以其他两个条件必须是真实的,必须有一个窗口,它必须有一个close方法,然后调用close方法,并且窗户关闭了。

然后是逗号。来自 docs

  

逗号运算符计算每个操作数(从左到右)   并返回最后一个操作数的值。

我们有

("function" == typeof popup_window.close && popup_window.close(), popup_window = is_null);

让我们用不同的方式写一下

(                          // ↓ must be thruthy .... ↓ for this to execute
   (typeof popup_window.close === "function" && popup_window.close())
   , popup_window = is_null
);      // ↑ unrelated, it's just another operand, seperated by comma

这里的诀窍是,逗号之后的最后一部分总是被执行,因为所有被逗号分隔的操作数都会被评估。

这意味着,如果popup_window不是is_null,则popup_window会明确设置为is_null,无论第二个条件如何。

第二个条件也是只有popup_window不是is_null,它会检查是否有close()方法,然后关闭窗口,逗号后的语句不相关到那个条件的结果。

要写得更简单(它本应该写成IMO的方式)

if ( popup_window != is_null ) {

    if ( typeof popup_window.close === "function" ) {
        popup_window.close();
    }

    popup_window = is_null;

}