我在一本书中看到了这个陈述,但我还没有找到解释。
function foo() { return false }
alert(foo() == !foo); //message box says TRUE
alert(foo() == !foo()); //message box says FALSE
我一直在想第一个警报会说是假的。但它说TRUE(?)
您可以看到最后一个语句中的括号使表达式返回FALSE。请告诉我这里缺少的东西。
答案 0 :(得分:4)
foo
是一个函数,因此它不是false
function foo() { return false; };
alert(typeof foo); // function
alert(typeof foo()); // boolean
alert(!function (){}); // false
答案 1 :(得分:2)
在第一种情况下:
foo() == !foo
LHS为foo()
- 返回false
RHS是!foo
- 由于foo
存在(并且不是假的),!foo
就像!true
并且评估为false
因此foo() == !foo
为true
在第二种情况下:
foo() == !foo()
LHS是foo()
,我们知道false
RHS为!foo()
- 这就是说!false
,即true
因此foo() == !foo()
为false
答案 2 :(得分:1)
!
运算符将值转换为布尔值,然后将其反转。转换为布尔值时,函数变量为TRUE
。
因此,!foo
为!TRUE
,即FALSE
。 foo()
会返回FALSE
,所以foo() == !foo
。
foo()
返回FALSE
,!foo()
为TRUE
,因为它取消了返回值。因此,foo()
不等于!foo()
。
答案 3 :(得分:0)
对于第一个,foo
不是函数foo
的调用,而是函数本身,因为函数已定义,它等效true
(但不是真的{ {1}})。当它反转(true
)时,它变为!
。将其与false
(返回foo()
)进行比较,结果为false
,因为true
为false == false
。
对于第二个,true
现在是函数foo()
的函数调用,而函数foo
又返回false
。倒置它会使其true
,并将其与另一个foo()
调用(false
)进行比较,得出false
,因为false == true
是false