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会做的是强制匹配true
的someVar
的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)
将会执行,如果booleanValue
是truthy – 除了0
, false
, ''
, NaN
, null
和undefined
。
if (booleanValue === true)
只有在booleanValue
精确等于true
才会执行。
既然你已经明确初始化为布尔,我认为===
运算符不是必需的。
由于检查值是布尔值,所以首选使用它直接用于较less的编码,它完全相同==真
标识(===)运算符的行为与相等(==)运算符的行为相同,除非不进行types转换,并且types必须相同才能被视为相等。
if(booleanValue)本质上是if(booleanValue == true)。
这取决于。 如果你担心你的variables最终可能会parsing为TRUE。 那么严格的检查是必须的。 否则,这取决于你。 然而,我怀疑whatever == TRUE
的语法都会混淆谁知道他们在做什么。
如果variables只能采用布尔值,那么使用较短的语法是合理的。
如果它可能被分配其他types,并且你需要区分true
或者"foo"
,那么你必须使用=== true
。
我认为你的推理是正确的。 但在实践中,我发现省略===
比较更为常见。 我认为有三个原因:
- 它通常不会增加expression式的含义,即在已知该值为布尔值的情况下。
- 因为JavaScript中存在大量的types不确定性,所以当您得到意外的
undefined
或null
值时,强制types检查往往会咬你。 通常你只是想让你的testing在这种情况下失败。 (虽然我试图平衡这个观点与“快速失败”的座右铭)。 - JavaScript程序员喜欢用types快速和松散地播放,特别是在布尔expression式中 – 因为我们可以。
考虑这个例子:
var someString = getInput(); var normalized = someString && trim(someString); // trim() removes leading and trailing whitespace if (normalized) { submitInput(normalized); }
我认为这种代码并不less见。 它处理getInput()
返回undefined
, null
或空string的情况。 由于两个布尔值评估,仅当给定input是包含非空白字符的string时才调用submitInput()
。
如果第一个参数是truthy,那么JavaScript &&
返回它的第一个参数,如果它是falsy或者它的第二个参数; 所以如果someString
是未定义的, normalized
将是未定义的,等等。 这意味着上述布尔expression式的input都不是布尔值。
我知道很多习惯于强types检查的程序员在看到这样的代码的时候会畏缩畏缩。 但是请注意,应用强types可能需要显式检查null
或undefined
值,这会使代码混乱。 在JavaScript中是不需要的。
在Javascript中,布尔的想法是相当模糊的。 考虑一下:
var bool = 0 if(bool){..} //evaluates to false if(//uninitialized var) //evaluates to false
所以,当你使用if语句(或其他控制语句)时,不必使用“boolean”types的variables。 因此,在我看来,如果你知道它是一个布尔值,那么你的语句中的“===真”部分是不必要的,但是如果你的值是一个模棱两可的“真理”variables,那么这是绝对必要的。 更多关于javscript的布尔可以在这里find。