2

在某人的网站上遇到以下内容,我很想了解此处应用的快捷方式。我出于演示目的简化了变量。

 function(){
      _imaboolean || ($element.removeClass("hidden").addClass("visible"), this.imaboolean = !0)
 }

同样的事情

this._imaboolean && ($element.removeClass("visible").addClass("hidden"), this._imaboolean = !1)
4

5 回答 5

5

那是一些糟糕的“聪明”代码,但是,让我们分解它!

_imaboolean || ($element.removeClass("hidden").addClass("visible"), this.imaboolean = !0)

首先,让我们用占位符替换所有表达式(注意这些表达式不是纯粹的并且有副作用):

a || (b, c)

请注意,这||是短路使得正确的表达式 - - 只有在评估为 false-y 值(b, c)时才会被评估。a

所以,让我们假设a评估为 false-y 值,然后(b, c)被评估。在这种情况下,,运算符分隔子表达式;所有子表达式都按顺序计算。表达式的结果是最后一个子表达式的结果。

这意味着它大致相当于(尽管没有函数或绑定上下文并且结果无论如何都会被抛出):

(function () { b; return c })()

这有意义吗?不,当然不!

像你的意思那样写:

if (!_imaboolean) {
  $element.removeClass("hidden").addClass("visible");
  this.imaboolean = true; // get rid of !0 too
}
于 2013-05-07T19:37:01.277 回答
2

这段代码可以膨胀为:

function() {
    if (!this.imaboolean) {
        $element.removeClass("hidden").addClass("visible");
        this.imaboolean = true;
    }
}

||用作短路,如果是imabooleantrue它将中断,但是如果是false,它将执行表达式的其余部分。!0是一种缩小的说法true(因为在布尔表达式中0求值)。false

于 2013-05-07T19:33:35.553 回答
1

我相信它是缩写

 function(){
      if( ! _imaboolean){
         $element.removeClass("hidden").addClass("visible");
         this.imaboolean = true; 
     }
 }

在我看来,它的编码通常也很糟糕,不应该被复制。

于 2013-05-07T19:31:41.230 回答
0

这是一个短路评估,只有在第一部分失败时才会评估第二部分。

于 2013-05-07T19:30:32.450 回答
0
function(){
      _imaboolean || ($element.removeClass("hidden").addClass("visible"), this.imaboolean = !0)
 }

让我们分解一下。首先我们看到||操作符,所以我们有(statement) || (anotherStatement). 工作方式||是它评估第一个语句。如果计算结果为真,它将短路并且不计算第二个语句。第一条语句是_imaboolean. 如果这是一个真实值(即,不是 0 或 false 或未定义......),那么我们就停在那里,不要转到第二个语句。

第二个说法是

($element.removeClass("hidden").addClass("visible"), this.imaboolean = !0)

同样,有两个语句,用逗号分隔。逗号运算符计算两个语句,并返回最后一个。所以它评估$element.removeClass("hidden").addClass("visible")(在 $element 上设置一些类),然后评估this.imaboolean = !0(将 this.imaboolean 设置为真值)。下次运行该功能时,由于操作者的原因会短路||

于 2013-05-07T19:36:33.747 回答