这个缩小的JS与这个未压缩的版本相同怎么样?

时间:2013-03-27 05:01:11

标签: javascript

所以这就是我未压缩的样子:

function extractDropdownValues(){     
  var all_selected = true;
  $('.variant_options select').each(function() { 
      if (this.selectedIndex == 0) {
          all_selected = false;
      }
  });

这是压缩版本:

extractDropdownValues(){var e=!0;$(".variant_options select").each(function(){this.selectedIndex==0&&(e=!1)});

我对e=!0等同于all_selected = true以及this.selectedIndex==0 if语句的压缩版本感到困惑。在压缩版本中,它表示if此索引== 0,然后将其设置为false。

但是在压缩版本中,它似乎正在检查selectedIndex是否等于0 && all_selected = false(即e=!1)。但是我不希望这是if条件,这应该是if条件满足后的结果。

我读错了吗?

P.S。压缩版本在生产中不起作用,但未压缩版本在dev中工作。我不确定这两者是否相关,但从表面上看,它们似乎与我完全相同。

修改1

我怀疑,我通过JS预处理器运行缩小的JS,这就是结果:

function extractDropdownValues() {
    var e = !0;
    $(".variant_options select").each(function () {
        this.selectedIndex == 0 && (e = !1)
    });

Soo ......啊...... WTF正在这里发生?

1 个答案:

答案 0 :(得分:5)

布尔形式的

0为false,因此布尔否定为0(false)为真。

类似地,布尔形式的1为真,因此布尔值为1(true)的否定为假。

&&是短路'和'运算符,意味着只要它知道结果是什么,它立即返回 - 如果它的第一个操作数为假,则返回false。如果它的第一个操作数为true,那么它只会计算第二个操作数并返回它。

所以e=!1仅在this.selectedIndex==0为真时执行(因为如果它是假的,它知道它将返回false并提前中止)。