在进行条件评估时,逗号运算符(表达式,表达式)在Javascript中的含义是什么?

时间:2017-01-27 10:01:09

标签: javascript

我们用uglify-js缩小我们的代码,我发现了一个在编译以下javascript时使用的奇怪格式:

console.debug(`[NotificationOpenedHandler] Received additionalData:`, data);
if(data.type && data.id) {
// more code...

这将转变为以下内容:

if (console.debug(`[NotificationOpenedHandler] Received additionalData:`, e), e.type && e.id) {

首先我认为它有些编译器错误,可能是uglify-js在尝试最小化代码时生成的,但在测试后似乎(true, true & false)它是一个有效的表达式(没有语法错误)。

第一个表达式的值并不重要

(true, true & false) // -> false
(true, true & true) // -> true
(false, true & false) // -> false
(false, true & true) // -> true

我的问题,这个表达是什么意思?

1 个答案:

答案 0 :(得分:3)

  

我的问题,这个表达是什么意思?

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

  

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

示例:

if (y = f(x), y > x) {
    // do something ...
}

首先执行y = f(x)设置y的值(取决于x)。然后检查是否y > x。如果True然后do something,则不执行任何操作。它与:

相同
y = f(x);
if (y > x) {
    // do something ...
}

在您的示例中:

(true, true & false)
// process `true` (does nothing)
// returns the result of `true & false` => false

(true, true & true)
// process `true` (does nothing)
// returns the result of `true & true` => true

(false, true & false)
// process `false` (does nothing)
// returns the result of `true & false` => false

(false, true & true)
// process `false` (does nothing)
// returns the result of `true & true` => true

进一步的例子:

(true, true, true, false) // returns false
(false, false, false, true) // returns true

所以,在您的应用程序代码中:

if (console.debug(`[NotificationOpenedHandler] Received additionalData:`, e), e.type && e.id) {

与:

相同
console.debug(`[NotificationOpenedHandler] Received additionalData:`, data);
if(data.type && data.id) {