if语句中的boolean

时间:2013-03-13 18:50:12

标签: javascript semantics

今天我已经对代码进行了评论,考虑了我在学校作业中检查变量是真还是假的方式。

我写的代码是这样的:

var booleanValue = true;

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

他们说这样写的更好/更好:

var booleanValue = true;

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

我对“=== true”部分的评论是,它不需要,可能会产生混淆。

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

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

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

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

例如,

0和1不应该在该变量中。

14 个答案:

答案 0 :(得分:176)

首先,事实:

if (booleanValue)

if包括booleanValue的任何真实值,任何非零数字,任何非空字符串值,任何对象或数组引用等满足true语句。 ..

另一方面:

if (booleanValue === true)

如果if完全等于booleanValue,则只会满足true条件。没有其他真正的价值可以满足它。

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

if (someVar == true)

然后,Javascript将执行的操作是键入coerce 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 

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

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


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

进行比较
if (booleanValue === true)

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

if (booleanValue)

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

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

if (booleanValue === true)

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


例如,如果你看一下jQuery中.on()的实现,它有一个可选的返回值。如果回调返回false,则jQuery将自动停止事件的传播。在这种特定情况下,由于jQuery希望仅在返回false时停止传播,因此它们会检查=== false的返回值明确性,因为它们不希望undefined0""或其他任何会自动键入转换为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;
    }
    ...

答案 1 :(得分:34)

如果你写:if(x === true),只有x = true

才会成立

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

答案 2 :(得分:8)

在普通的“if”中,变量将被强制转换为布尔值,并在对象上使用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 {
....
}

答案 3 :(得分:5)

这取决于你的用例。检查类型也是有意义的,但如果它只是一个标志,则不会。

答案 4 :(得分:4)

一般而言,省略=== true

更简洁

但是,在Javascript中,这些陈述是不同的。

如果if (booleanValue) truthy ,则会执行

booleanValue - 除0false'',{{1 }},NaNnull

仅当undefined恰好等于if (booleanValue === true)时才会执行

booleanValue

答案 5 :(得分:2)

由于您已经明确初始化为bool,我认为不需要===运算符。

答案 6 :(得分:2)

由于选中的值是布尔值,因此它更喜欢直接使用它来减少编码,并且它完全相同== true

答案 7 :(得分:2)

identity(===)运算符的行为与equality(==)运算符完全相同,但不进行类型转换,并且类型必须相同才能被视为相等。

if(booleanValue)实际上是if(booleanValue == true)。

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

如果可能会为其他类型分配,并且您需要将true1"foo"区分开来,则必须使用=== true

答案 10 :(得分:1)

在Javascript中,boolean的想法很模糊。考虑一下:

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

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

因此,当您使用if语句(或任何其他控制语句)时,不必使用“boolean”类型var。因此,在我看来,如果你知道它是一个布尔值,你的语句的“=== true”部分是不必要的,但如果你的值是一个模糊的“truthy”变量,绝对必要。有关javscript中布尔值的更多信息,请参见here

答案 11 :(得分:1)

我认为你的推理是合理的。但实际上我发现省略===比较更为常见。我认为有三个原因:

  1. 它通常不会增加表达式的含义 - 无论如何都知道该值是boolean的。
  2. 由于JavaScript中存在大量的类型不确定性,因此当您获得意外的undefinednull值时,强制进行类型检查往往会让您感到困惑。通常,您只是希望您的测试在这种情况下失败。 (虽然我试图平衡这种观点与“快速失败”的座右铭)。
  3. JavaScript程序员喜欢快速和松散地使用类型 - 特别是在布尔表达式中 - 因为我们可以。
  4. 考虑这个例子:

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

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

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

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

答案 12 :(得分:1)

Revisa Is it necessary to register interest to write to a NIO socket to send data?

示例:

var p=5;

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

===表示相同类型也相同值 ==相同的值

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

答案 13 :(得分:0)

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