Javascript 使用短路的变量声明

Javascript 使用短路的变量声明,javascript,jquery,Javascript,Jquery,我刚刚浏览了一个JQuery插件,发现了以下代码行: var doAnimate = $.support.transition && animate 我确实理解短路,但这是使用短路的变量声明吗 在询问比我更有经验的人时,我得到了以下答复: 如果加载了过渡库,请使用它,否则请使用动画 我猜返回的值不是真或假,因为我听说短路不会返回真或假 因此,如果未定义$.support.transition,则动画将存储在doAnimate中 这就是它的工作原理吗?我真的很困惑这个变量声明以及

我刚刚浏览了一个JQuery插件,发现了以下代码行:

var doAnimate = $.support.transition && animate
我确实理解短路,但这是使用短路的变量声明吗

在询问比我更有经验的人时,我得到了以下答复:

如果加载了过渡库,请使用它,否则请使用动画

我猜返回的值不是真或假,因为我听说短路不会返回真或假

因此,如果未定义
$.support.transition
,则动画将存储在
doAnimate

这就是它的工作原理吗?我真的很困惑这个变量声明以及它是如何工作的。我理解条件句中的短路

如果加载了过渡库,请使用它,否则请使用动画

他们的意思是使用
|
操作符

var doAnimate = $.support.transition || animate;
上面所做的是,它检查
$.support.transition
是否可用,或者是否已加载、使用它,或者是否使用
动画

当我们执行
expr1&&expr2
时,如果为false,则返回
expr1
;否则,返回
expr2

因此,当您执行
var-doAnimate=$.support.transition&&animate
,如果
$.support.transition
未加载或
未定义
doAnimate
仍将保持
$.support.transition
,而不是
动画

如果已加载,则将使用
动画
。这与你想要的相反。这就是
|
开始行动的地方

当我们执行
expr1 | | expr2
时,如果它是真实的,它将返回
expr1
;否则,返回
expr2

因此,当我们使用
|
时,如果加载了
$.support.transition
,将使用它,否则将使用
动画


您可以看出变量“doAnimate”确实被用作布尔值,&&是他们要写的。“doAnimate”将为真或假

&&是一个二进制逻辑运算符,相当于和。如果您知道&&的真值表,那么您已经知道表达式中的两个元素都必须为真,才能将整个表达式计算为真。
短路利用了这个因素:如果第一个元素为false,则不需要检查第二个元素。
在javascript中,true\false被处理,而不是。。。创造性地。在这种情况下,undefined将被评估为false。
在您的案例中,您可以在

上阅读更多内容:

var doAnimate = $.support.transition && animate;
仅当
$.support.transition
truthy时,它将计算
动画
,并将
动画
分配给
动画

如果
$.support.transition
无效。然后它将返回值
$.support.transition

如果两个值都是真实的,则只需
设置动画

但你真正想要的是:

var doAnimate = $.support.transition || animate;

它从左到右检查真实性。如果遇到任何第一个truthy值,它会将该值存储到doAnimate。

问题中的代码是引导的一部分。因此,它经过了很好的测试,显然没有错。其他回答说代码应该是
|
而不是
&&
,这并不能真正理解代码在这种情况下的真正意图(是正确的,但我会尝试更好地解释)

如果我们检查一下,就会发现
$.support.transition
是一个布尔值。我复制了下面的代码,在其中我们可以看到其余的代码,包括问题中的代码行:

var animate = this.$element.hasClass('fade') ? 'fade' : ''  // <--- animate is a string
// ... more code ...
  var doAnimate = $.support.transition && animate           // <--- doAnimate is either
                                                            //      a string or false
  this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') // <- animate used
                                                                       //    as a string
  // ... more code ...
  if (doAnimate) this.$backdrop[0].offsetWidth  // <- doAnimate used only for truthfulness
  // ... more code ...
  doAnimate ?  // <---------------------------------- doAnimate used only for truthfulness
    this.$backdrop
      .one('bsTransitionEnd', callback)
      .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
    callback()

var animate=this.$element.hasClass('fade')?'fade':''//这段代码用通俗易懂的英语对我说:“如果它不支持动画和过渡,那么就不要动画。”您好,请查看我关于短路的小博客,我希望它能有所帮助:
var useThis=ifTruthy | elseThis,你能给我和&&相同的语法吗?谢谢。ur
上面所做的是,它检查$.support.transition是否可用,或者是否已加载,请使用它,否则请使用动画。
相同,如果加载了转换库,请使用它,否则请使用动画。
@AlexanderSolonik yes。这就是我想说的。对我来说仍然没有意义,你能编辑答案来告诉我,
var-doAnimate=$.support.transition | | animate
var-doAnimate=$.support.transition&&animate