逗号分隔的表达式可以用作 Javascript 中的 if 语句吗?
Can comma separated expressions be used as if statement in Javascript?
我正在尝试理解大量使用逗号分隔表达式的脚本。例如:
popup_window != is_null && ("function" == typeof popup_window.close && popup_window.close(), popup_window = is_null);
如果逗号分隔确实意味着 "evaluate all of the following expressions, then produce the value of the final expression"(如 this SO answer),那么这是 if 语句的另一种形式吗?
喜欢:
"if popup_window is not null and popup_window.close is a method then call this method and set popup_window to null"
无论如何,我不确定我是否理解语法。
问题:
这个语句是什么意思,逗号分隔是怎么回事?这应该是一个 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
不能为 null。
其次,我们可以假设 popup_window
是另一个 window,以 window.open
打开,因为它应该有一个 close
函数,这有点像 Yoda 条件,但是也可以写成
typeof popup_window.close === "function"
所以popup_window
必须有一个close
方法才能继续下一步。
最后一步关闭弹出 window 如果它不为空,并且如果它有 close
方法。
popup_window.close()
所以其他两个条件必须为真才能走到这一步,必须有一个 window,它必须有一个 close
方法,然后 close
方法被调用,window被关闭。
然后是逗号。来自docs
The comma operator evaluates each of its operands (from left to right)
and returns the value of the last operand.
我们有
("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()
方法,关闭window,逗号后的语句与该条件的结果无关。
写得更简单(IMO 应该写的方式)
if ( popup_window != is_null ) {
if ( typeof popup_window.close === "function" ) {
popup_window.close();
}
popup_window = is_null;
}
我正在尝试理解大量使用逗号分隔表达式的脚本。例如:
popup_window != is_null && ("function" == typeof popup_window.close && popup_window.close(), popup_window = is_null);
如果逗号分隔确实意味着 "evaluate all of the following expressions, then produce the value of the final expression"(如 this SO answer),那么这是 if 语句的另一种形式吗?
喜欢:
"if popup_window is not null and popup_window.close is a method then call this method and set popup_window to null"
无论如何,我不确定我是否理解语法。
问题:
这个语句是什么意思,逗号分隔是怎么回事?这应该是一个 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
不能为 null。
其次,我们可以假设 popup_window
是另一个 window,以 window.open
打开,因为它应该有一个 close
函数,这有点像 Yoda 条件,但是也可以写成
typeof popup_window.close === "function"
所以popup_window
必须有一个close
方法才能继续下一步。
最后一步关闭弹出 window 如果它不为空,并且如果它有 close
方法。
popup_window.close()
所以其他两个条件必须为真才能走到这一步,必须有一个 window,它必须有一个 close
方法,然后 close
方法被调用,window被关闭。
然后是逗号。来自docs
The comma operator evaluates each of its operands (from left to right) and returns the value of the last operand.
我们有
("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()
方法,关闭window,逗号后的语句与该条件的结果无关。
写得更简单(IMO 应该写的方式)
if ( popup_window != is_null ) {
if ( typeof popup_window.close === "function" ) {
popup_window.close();
}
popup_window = is_null;
}