boolean在一个if语句中

今天,我已经得到了关于代码的评论,考虑了我在学校任务中​​检查variables是真是假的方式。

我写的代码是这样的:

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

他们说这样写就好:

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

我对“===真”部分的评论是没有必要,可能造成混乱。

不过,我的想法是,最好检查一下variables是否是一个布尔值,特别是因为Javascript是一个loosetyped语言。

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

所以我的问题 将来是否会放松“===真”部分是更好的做法,或者是检查variables的types也是一个好习惯。

编辑:在我的“真实”的代码布尔代表是否图像已被删除,所以只有值boolValue应该永远是真或假。

例如0和1不应该在该variables中。

首先,事实:

 if (booleanValue) 

将满足if语句的任何booleanValue true值,包括true ,任何非零数字,任何非空string值,任何对象或数组引用等…

另一方面:

 if (booleanValue === true) 

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

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

 if (someVar == true) 

那么,Javascript会做的是强制匹配truesomeVar的types,然后比较这两个variables。 有很多情况下,这可能不是人们想要的。 正因为如此,在大多数情况下,你想避免==因为有一个关于如何使用Javascript的规则相当长的一套规则强制两件事情是相同的types,除非你了解所有这些规则,并可以预料到JS解释器的一切当给出两种不同的types(大多数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 

如果你写: if(x === true) ,只有x = true才是真的

如果你写: if(x) ,对于任何不是的string:“'(空string),false,null,undefined,0,NaN。

在普通的“如果”variables将被强制为一个布尔值,它使用对象上的布尔值: –

  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. 

但与===比较没有任何types的强制,所以他们必须是平等的,没有强制。

如果你说这个对象可能不是一个布尔值,那么你可能不得不考虑更多的是真/假。

 if(x===true){ ... } else if(x===false){ .... } else { .... } 

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

一般来说,省略=== true更简单和更简单。

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

if (booleanValue)将会执行,如果booleanValuetruthy – 除了0false''NaNnullundefined

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

既然你已经明确初始化为布尔,我认为===运算符不是必需的。

由于检查值是布尔值,所以首选使用它直接用于较less的编码,它完全相同==真

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

if(booleanValue)本质上是if(booleanValue == true)。

这取决于。 如果你担心你的variables最终可能会parsing为TRUE。 那么严格的检查是必须的。 否则,这取决于你。 然而,我怀疑whatever == TRUE的语法都会混淆谁知道他们在做什么。

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

如果它可能被分配其他types,并且你需要区分true或者"foo" ,那么你必须使用=== true

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

  1. 它通常不会增加expression式的含义,即在已知该值为布尔值的情况下。
  2. 因为JavaScript中存在大量的types不确定性,所以当您得到意外的undefinednull值时,强制types检查往往会咬你。 通常你只是想让你的testing在这种情况下失败。 (虽然我试图平衡这个观点与“快速失败”的座右铭)。
  3. JavaScript程序员喜欢用types快速和松散地播放,特别是在布尔expression式中 – 因为我们可以。

考虑这个例子:

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

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

如果第一个参数是truthy,那么JavaScript &&返回它的第一个参数,如果它是falsy或者它的第二个参数; 所以如果someString是未定义的, normalized将是未定义的,等等。 这意味着上述布尔expression式的input都不是布尔值。

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

在Javascript中,布尔的想法是相当模糊的。 考虑一下:

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

所以,当你使用if语句(或其他控制语句)时,不必使用“boolean”types的variables。 因此,在我看来,如果你知道它是一个布尔值,那么你的语句中的“===真”部分是不必要的,但是如果你的值是一个模棱两可的“真理”variables,那么这是绝对必要的。 更多关于javscript的布尔可以在这里find。