1

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

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)});

我对if 语句e=!0的等效all_selected = true和压缩版本感到困惑。this.selectedIndex==0在压缩版本中,它说if这个索引 == 0,然后将其设置为 false。

但在压缩版本中,它看起来像是在检查 是否selectedIndex等于 0 并且&&all_selected = falsee=!1)。但我不希望那个作为if条件,那应该是if条件满足后的结果。

我读错了吗?

PS 压缩版在生产中不工作,但未压缩的在开发中工作。我不确定这两者是否相关,但从表面上看,它们似乎与我并不相同。

编辑 1

正如我所怀疑的,我通过 JS 美化器运行了缩小的 JS,结果如下:

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

苏……啊……这里发生了WTF?

4

1 回答 1

5

布尔形式的 0 为假,因此 0(假)的布尔否定为真。

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

&&是短路'and'运算符,这意味着一旦它知道它的结果是什么,它就会立即返回——如果它的第一个操作数是假的,它就会返回假。如果它的第一个操作数为真,那么它只计算第二个操作数并返回它。

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

于 2013-03-27T05:02:54.323 回答