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



我正在努力理解大量使用逗号分隔表达式的脚本。例如:

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

如果逗号分隔的意思是";对以下所有表达式求值,然后产生最终表达式"的值;(正如在这个SO答案中),这是if语句的另一种形式吗?

喜欢:
"如果popup_window不为null并且popup_windows是一个方法;

问题
这句话的意思是什么?逗号分隔是怎么回事?这应该是if语句吗?

这是一系列真正的语句

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"

所以CCD_ 7必须具有CCD_。如果弹出窗口不为空,并且有close方法,则最后一步关闭弹出窗口。

popup_window.close()

所以其他两个条件必须是真的才能走到这一步,必须有一个窗口,必须有close方法,然后调用close方法,窗口关闭。

然后是逗号。从文档

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

我们有

("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;
}

相关内容

  • 没有找到相关文章