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