Javascript 使用短路的变量声明
我刚刚浏览了一个JQuery插件,发现了以下代码行:Javascript 使用短路的变量声明,javascript,jquery,Javascript,Jquery,我刚刚浏览了一个JQuery插件,发现了以下代码行: var doAnimate = $.support.transition && animate 我确实理解短路,但这是使用短路的变量声明吗 在询问比我更有经验的人时,我得到了以下答复: 如果加载了过渡库,请使用它,否则请使用动画 我猜返回的值不是真或假,因为我听说短路不会返回真或假 因此,如果未定义$.support.transition,则动画将存储在doAnimate中 这就是它的工作原理吗?我真的很困惑这个变量声明以及
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如果你这样做,我会接受你的回答。谢谢。@AlexanderSolonik我已经尽力解释了他们之间的区别。现在检查一下。