171

今天,考虑到我在学校作业中检查变量是真还是假的方式,我得到了一个关于代码的评论。

我写的代码是这样的:

var booleanValue = true;

function someFunction(){
    if(booleanValue === true){
        return "something";
    }
}

他们说这样写会更好/更整洁:

var booleanValue = true;

function someFunction(){
    if(booleanValue){
        return "something";
    }
}

我得到的关于“=== true”部分的评论是它不是必需的并且可能会造成混乱。

但是我的想法是最好检查变量是否为布尔值,特别是因为 Javascript 是一种松散类型的语言。

在第二个例子中,一个字符串也会返回“something”;

所以我的问题;将来松开“=== true”部分是否更整洁,或者检查变量的类型是否是一种好习惯。

编辑: 在我的“真实”代码中,布尔值表示图像是否已被删除,因此 boolValue 应该具有的唯一值是真或假。

例如,0 和 1 不应该在该变量中。

4

14 回答 14

261

首先,事实:

if (booleanValue)

将满足if任何真值的陈述,booleanValue包括true、任何非零数、任何非空字符串值、任何对象或数组引用等......

另一方面:

if (booleanValue === true)

仅当完全等于时才满足if条件。没有其他真值可以满足它。booleanValuetrue

另一方面,如果你这样做:

if (someVar == true)

然后,Javascript 会做的是强制类型true匹配的类型,someVar然后比较两个变量。在很多情况下,这可能不是人们想要的。正因为如此,在大多数情况下你要避免==,因为有一组相当长的规则关于 Javascript 将如何强制将两个东西强制为同一类型,除非你理解所有这些规则并且可以预测 JS 解释器在什么时候可能会做的所有事情给定两种不同的类型(大多数 JS 开发人员不能),您可能希望==完全避免。

举个例子来说明它是多么令人困惑:

var x;

x = 0;
console.log(x == true);   // false, as expected
console.log(x == false);  // true as expected

x = 1;
console.log(x == true);   // true, as expected
console.log(x == false);  // false as expected

x = 2;
console.log(x == true);   // false, ??
console.log(x == false);  // false 

对于 value 2,您会认为这2是一个真实的值,因此它会优于true,但这不是类型强制的工作方式。它正在转换右手值以匹配左手值的类型,因此它转换true为数字1,因此它正在比较2 == 1这肯定不是您可能想要的。

所以,买家要小心。==除非您明确知道要比较的类型并知道所有可能的类型强制算法如何工作,否则几乎在所有情况下都最好避免使用。


因此,这实际上取决于预期值booleanValue以及您希望代码如何工作。如果您事先知道它只会有一个trueorfalse值,那么将它明确地与

if (booleanValue === true)

只是额外的代码和不必要的

if (booleanValue)

更紧凑,可以说更清洁/更好。

另一方面,如果您不知道booleanValue可能是什么并且您想测试它是否真的设置为true不允许其他自动类型转换,那么

if (booleanValue === true)

不仅是一个好主意,而且是必需的。


例如,如果您查看.on()jQuery 中的实现,它有一个可选的返回值。如果回调返回false,则 jQuery 将自动停止事件的传播。在这种特定情况下,由于 jQuery 只想false在返回时停止传播,因此他们明确检查返回值,=== false因为他们不希望undefinedor 0or""或任何其他会自动类型转换为 false 的东西也满足比较。

例如,这里是 jQuery 事件处理回调代码:

ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );

if ( ret !== undefined ) {
     event.result = ret;
     if ( ret === false ) {
         event.preventDefault();
         event.stopPropagation();
     }
 }

您可以看到 jQuery 明确地寻找ret === false.

但是,考虑到代码的需要,jQuery 代码中还有许多其他地方适合进行更简单的检查。例如:

// The DOM ready check for Internet Explorer
function doScrollCheck() {
    if ( jQuery.isReady ) {
        return;
    }
    ...
于 2013-03-13T19:00:29.093 回答
45

如果你写:if(x === true),只有 x = true 才会成立

如果你写: if(x),任何x都不是:''(空字符串)、false、null、undefined、0、NaN。

于 2013-03-13T18:55:56.323 回答
8

在普通的“如果”中,变量将被强制为布尔值,并在对象上使用 toBoolean:-

    Argument Type   Result

    Undefined       false
    Null            false
    Boolean         The result equals the input argument (no conversion).
    Number          The result is false if the argument is +0, −0, or NaN;
                    otherwise the result is true.
    String          The result is false if the argument is the empty 
                    String (its length is zero); otherwise the result is true.
    Object          true.

但是与 === 的比较没有任何类型强制,所以它们必须相等而没有强制。

如果您说该对象甚至可能不是布尔值,那么您可能需要考虑的不仅仅是真/假。

if(x===true){
...
} else if(x===false){
....
} else {
....
}
于 2013-03-13T19:17:04.117 回答
5

这取决于您的用例。检查类型也可能有意义,但如果它只是一个标志,它就没有。

于 2013-03-13T18:51:41.483 回答
5

一般来说,省略=== true.

但是,在 Javascript 中,这些语句是不同的。

if (booleanValue)如果booleanValue,将执行- 除了0, false, '', NaN, null, 和undefined.

if (booleanValue === true)booleanValue只有在精确等于时才会执行true

于 2013-03-13T18:53:30.327 回答
4

标识(===)运算符的行为与相等(==)运算符相同,只是不进行类型转换,并且类型必须相同才能被视为相等。

于 2013-03-13T18:54:40.083 回答
3

由于检查值是Boolean首选直接使用它来减少编码,而且它完全一样==true

于 2013-03-13T18:54:29.217 回答
3

如果变量只能采用布尔值,那么使用较短的语法是合理的。

如果它可能被分配其他类型,并且您需要与or区分开true来,那么您必须使用.1"foo"=== true

于 2013-03-13T18:55:50.537 回答
2

由于您已经清楚地初始化为布尔值,我认为===不需要运算符。

于 2013-03-13T18:53:22.300 回答
2

在 Javascript 中,布尔值的概念相当模糊。考虑一下:

 var bool = 0 
 if(bool){..} //evaluates to false

 if(//uninitialized var) //evaluates to false

因此,当您使用 if 语句(或任何其他控制语句)时,不必使用“布尔”类型的 var。因此,在我看来,如果你知道它是一个布尔值,那么你声明的“=== true”部分是不必要的,但如果你的值是一个模棱两可的“真实”变量,那么它是绝对必要的。更多关于 javscript 中布尔值的信息可以在这里找到。

于 2013-03-13T19:01:15.130 回答
2

我认为你的推理是合理的。但在实践中,我发现省略===比较更为常见。我认为有以下三个原因:

  1. 它通常不会增加表达式的含义 - 这是在已知值无论如何都是布尔值的情况下。
  2. 因为 JavaScript 中存在大量类型不确定性,所以当你得到一个意外的值undefinednull值时,强制进行类型检查往往会咬你一口。通常你只是希望你的测试在这种情况下失败。(尽管我试图平衡这种观点与“快速失败”的座右铭)。
  3. JavaScript 程序员喜欢在类型上玩得又快又松——尤其是在布尔表达式中——因为我们可以。

考虑这个例子:

var someString = getInput();
var normalized = someString && trim(someString);  
// trim() removes leading and trailing whitespace

if (normalized) {
    submitInput(normalized);
}

我认为这种代码并不少见。它处理getInput()返回undefinednull或空字符串的情况。由于两个布尔评估submitInput()仅在给定输入是包含非空白字符的字符串时才调用。

在 JavaScript&&中,如果它是假的,则返回它的第一个参数;如果第一个参数是真,则返回它的第二个参数;如果未定义等等normalized也会如此。这意味着上述布尔表达式的输入实际上都不是布尔值。undefinedsomeString

我知道很多习惯于强类型检查的程序员在看到这样的代码时会畏缩。但请注意,应用强类型可能需要对nullundefined值进行显式检查,这会使代码混乱。在不需要的 JavaScript 中。

于 2013-03-13T19:11:30.160 回答
1

这取决于。如果您担心您的变量最终可能会解析为 TRUE。然后硬检查是必须的。否则由你决定。但是,我怀疑这种语法whatever == TRUE会让任何知道他们在做什么的人感到困惑。

于 2013-03-13T18:54:40.917 回答
1

修订https://www.w3schools.com/js/js_comparisons.asp

例子:

var p=5;

p==5 ? true
p=="5" ?  true
p==="5" ? false

=== 表示相同类型也相同值 == 只是相同值

在此处输入图像描述

于 2019-09-03T17:56:55.860 回答
1

如果需要测试对象,也可以使用布尔对象进行测试 error={Boolean(errors.email)}

于 2019-11-05T08:55:16.980 回答