解释为什么在Javascript中false和modulus总是等于true

4

你好,我有一个问题,虽然我知道答案但是无法用语言表达(最好的说法是“我不知道为什么”)。我正在为我的初级开发人员(他们非常初级)准备一个简单的测试,如下所示...

编写一个名为fooBar的函数,它接受一个参数

  1. 如果参数是3的倍数,则返回“foo”
  2. 如果参数是5的倍数,则返回“bar”
  3. 如果参数既是3的倍数又是5的倍数,则返回“fooBar”
  4. 否则返回原始参数

我希望或期望得到以下答案:

function fooBar (n) {

    if ((n % 3 === 0) && (n % 5 === 0)) {
        return "fooBar";
    } else if (n % 3 === 0)  {
        return "foo";
    } else if (n % 5 === 0) { 
        return "Bar";
    } else {
        return n;
    }
}

一切都很好,但我希望能够在以下所有情况中使函数正常工作或逻辑上合理,除了一个情况,我想要捉弄那些初学者。

fuzzBuzz(3); // returns "foo"
fuzzBuzz(5); // returns "Bar"
fuzzBuzz(15); // returns "fooBar"
fuzzBuzz(true); // returns true
fuzzBuzz(false); // returns "fooBar"
fuzzBuzz(function(){return true;}); // returns "function anonymous()"

当我们传递false时,我们会得到一个意外的结果,因为(false % 3 === 0)(false % 5 === 0)等于true。我期望这个...我只是无法解释为什么,有人能用语言解释一下为什么会出现这种奇怪的行为吗?我曾经认为这是JavaScript的“怪癖”!

3
我假设(因此进行评论而非回答),false 转换为数字,这个数字应该是0。然后逻辑就会正确地跟进。 - James Thorpe
3个回答

2
EMCA Script 5.1 标准的第11.5节中,它规定乘法运算符的两个操作数都会被转换为数字。 % 运算符被认为是乘法运算符。
数值转换在 第9.3节 中指定,该节规定了布尔值转换时:

如果参数为 true,则结果为1。如果参数为 false,则结果为+0。

因此,(n % 3 === 0) && (n % 5 === 0) 为 true,函数返回 fooBar

那是规范中我没时间找到的部分 :) - James Thorpe

1

我认为如果您在任何算术表达式中使用false,则会被计算为0。

alert(false +0 );  // this gives 0

所以false%3 ==0的结果为true。

同样地,true的结果为1。

Fiddle链接


1

当true被转换为1,false被转换为0时,如果你传递false并且满足条件n % 3 === 0,那么你应该得到fooBar,而当你传递true时,没有一个条件成立,因此返回true本身。

fiddle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接