JavaScript中的条件表达式受括号影响

JavaScript中的条件表达式受括号影响,javascript,Javascript,我在一本书中偶然发现了这种说法,但我还没有找到解释 function foo() { return false } alert(foo() == !foo); //message box says TRUE alert(foo() == !foo()); //message box says FALSE 我一直在想,第一个警报会说是假的。但它说的是真的(?) 您可以看到,上一条语句中的括号使表达式返回FALSE。请告诉我这里缺少什么。foo是一个函数,因此它不是false function

我在一本书中偶然发现了这种说法,但我还没有找到解释

function foo() { return false }

alert(foo() == !foo); //message box says TRUE
alert(foo() == !foo()); //message box says FALSE
我一直在想,第一个警报会说是假的。但它说的是真的(?)


您可以看到,上一条语句中的括号使表达式返回FALSE。请告诉我这里缺少什么。

foo
是一个函数,因此它不是
false

function foo() { return false; };
alert(typeof foo); // function
alert(typeof foo()); // boolean
alert(!function (){}); // false

运算符将值转换为布尔值,然后将其反转。函数变量转换为布尔值时为
TRUE

所以,
!foo
!TRUE
,即
FALSE
foo()
返回
FALSE
,因此
foo()==!foo


foo()
返回
FALSE
,和
!foo()。所以,
foo()
不等于
!foo()在第一种情况下:

foo() == !foo
foo() == !foo()
LHS是
foo()
——返回
false

function foo() { return false; };
alert(typeof foo); // function
alert(typeof foo()); // boolean
alert(!function (){}); // false
RHS是
!foo
-既然
foo
存在(并且不是虚假的),
!foo
就像
!true
并计算为
false

function foo() { return false; };
alert(typeof foo); // function
alert(typeof foo()); // boolean
alert(!function (){}); // false
因此
foo()==!foo
真的


在第二种情况下:

foo() == !foo
foo() == !foo()
LHS是
foo()
,我们知道它是
false

RHS是
!foo()!假
,即


因此
foo()==!foo()
false

对于第一个函数,
foo
不是函数
foo
的调用,而是函数本身,因为函数是定义的,所以它是等价的
true
(但不是真正的
true
)。当您反转(
)它时,它将变为
false
。将其与
foo()
(返回
false
)进行比较会得到
true
,因为
false==false
true

function foo() { return false; };
alert(typeof foo); // function
alert(typeof foo()); // boolean
alert(!function (){}); // false

对于第二个函数,
foo()。将其反转为
true
,并将其与另一个
foo()
调用(即
false
)进行比较,会产生
false
,因为
false==true
false

这里的关键是要注意,在您的第一个
警报中,它正在评估
!foo
相反!foo()
。前者(不带
()
)表示函数变量本身,而第二个(带
()
)表示函数的已计算返回值。