JavaScript函数调用传递x&&;y作为参数

JavaScript函数调用传递x&&;y作为参数,javascript,extjs,extjs4,Javascript,Extjs,Extjs4,可能重复: 在的示例代码中,有以下调用: this.setActiveButton(activeWindow && activeWindow.taskButton); 方法: setActiveButton: function(btn) { if (btn) { btn.toggle(true); } else { this.items.each(function (item) { if (item.is

可能重复:

在的示例代码中,有以下调用:

this.setActiveButton(activeWindow && activeWindow.taskButton);
方法:

setActiveButton: function(btn) {
    if (btn) {
        btn.toggle(true);
    } else {
        this.items.each(function (item) {
            if (item.isButton) {
                item.toggle(false);
            }
        });
    }
}

函数调用中的
&&
的目的是什么?

它是为了确保在试图查找变量“activeWindow”引用的对象的属性之前,该变量确实引用了某些内容。如果它是
null
(或其他一些东西;我们假设代码知道它是对象引用或
null
),则会导致异常。通过这种方式,函数被传递到按钮引用(不管是什么)或
null

换言之,与此相同:

this.setActiveButton(activeWindow != null ? activeWindow.taskButton : null)

JavaScript中的
&&
运算符与C、Java或其他类似语言中的
&&
运算符相比有点特殊。在JavaScript中,首先计算左侧。如果该值为“falsy”(
null
undefined
false
、零或空字符串),则该值为表达式的值。否则,表达式的值就是右边的值。

这是为了确保在试图查找变量“activeWindow”引用的对象的属性之前,该变量确实引用了某些内容。如果它是
null
(或其他一些东西;我们假设代码知道它是对象引用或
null
),则会导致异常。通过这种方式,函数被传递到按钮引用(不管是什么)或
null

换言之,与此相同:

this.setActiveButton(activeWindow != null ? activeWindow.taskButton : null)
JavaScript中的
&&
运算符与C、Java或其他类似语言中的
&&
运算符相比有点特殊。在JavaScript中,首先计算左侧。如果该值为“falsy”(
null
undefined
false
、零或空字符串),则该值为表达式的值。否则,表达式的值就是右侧的值。

有关此方法的更多信息,请参阅

短路表达式x和y(使用Sand表示 短路变化)等效于条件表达式,如果 x然后y,否则为假;表达式x或y等价于if x then 真的

有关此方法的更多信息,请参阅

短路表达式x和y(使用Sand表示 短路变化)等效于条件表达式,如果 x然后y,否则为假;表达式x或y等价于if x then 真的


除了activeWindow或activeWindow.taskButton还可以是
未定义的
、空字符串或
0
,并且它将传递假。@jbabey是的,这是真的-这就是我所说的“或其他一些事情”,通过这种限定性假设,即代码知道它是对象引用或null。除了activeWindow或activeWindow.taskButton之外,它还可以是
未定义的
false
、空字符串或
0
,并且它将传递false。@jbabey是的,这是真的-这就是我所说的“或其他一些事情”,通过这种限定性假设,代码知道它是一个对象引用或null。在JavaScript中不正确-它不是真正的布尔运算符。整体表达式的值要么是左边的值,要么是右边的值,由左边的“真实性”决定。这并不重要,因为它已经关闭了,但我已经更新了我的答案以避免任何混淆。@RobB谢谢,但尖头的回答来得更早,所以我将他的标记为正确答案。仍然是+1。在JavaScript中不是真的-它不是真正的布尔运算符。整体表达式的值要么是左边的值,要么是右边的值,由左边的“真实性”决定。这并不重要,因为它已经关闭了,但我已经更新了我的答案以避免任何混淆。@RobB谢谢,但尖头的回答来得更早,所以我将他的标记为正确答案。仍然是+1。@z在JavaScript中不是很准确。
&&
的值不一定是布尔值。它可以是任何东西。@z在JavaScript中不是很准确。
&&
的值不一定是布尔值。它可以是任何东西。