2

我在一本书中看到了这个说法,但我还没有找到解释。

function foo() { return false }

alert(foo() == !foo); //message box says TRUE
alert(foo() == !foo()); //message box says FALSE

我一直在想第一个警报会说 FALSE。但它说的是真的(?)

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

4

4 回答 4

4

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

function foo() { return false; };
alert(typeof foo); // function
alert(typeof foo()); // boolean
alert(!function (){}); // false
于 2013-04-24T15:02:44.040 回答
2

在第一种情况下:

foo() == !foo

LHS 是foo()- 返回false

RHS 是!foo- 并且因为foo存在(并且不是假的),!foo所以就像!true并且评估为false

因此foo() == !footrue


在第二种情况下:

foo() == !foo()

LHS 是foo()我们false所知道的

RHS is !foo()- 这与说!false,即true

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

于 2013-04-24T15:04:24.297 回答
1

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

所以,!foo!TRUE,这是FALSEfoo()回报FALSE,所以foo() == !foo

foo()FALSEreturn和!foo()is TRUE,因为它否定了返回值。所以,foo()不等于!foo()

于 2013-04-24T15:03:48.403 回答
0

对于第一个,foo不是函数的调用foo,而是函数本身,并且由于定义了函数,因此它是等效的true(但不是真的true)。当你反转 ( !) 时,它变为false。将其与foo()(which 返回false) 进行比较,得到truesince false == falseis true

对于第二个,foo()现在是 function 的函数调用foo,而后者又返回false。将其反转为true,并将其与另一个foo()调用(即 is false)进行比较产生false,因为false == trueis false

于 2013-04-24T15:09:59.177 回答