If 语句中的布尔值

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

我写的代码是这样的:

var booleanValue = true;


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

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

var booleanValue = true;


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

我得到的关于“ = = 真”部分的评论是,这是不需要的,可能会造成混乱。

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

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

所以我的问题是: 在将来去掉“ = = = true”部分是否更简单,或者检查变量的类型是否也是一个很好的实践。

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

例如,0和1不应该出现在那个变量中。

549424 次浏览

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

因为您已经清楚地初始化为 bool,所以我认为不需要 ===操作符。

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

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

除了 0false''NaNnullundefined之外,如果 booleanValue真心话 & nash; ,if (booleanValue)将执行。

只有当 booleanValue精确地等于 true时,if (booleanValue === true)才会执行。

因为检查的值是 Boolean,所以它更倾向于直接使用它来减少编码,而且它完全做了相同的 ==true

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

这要看情况。如果您担心您的变量最终可能解析为 TRUE。那么严格检查是必须的。否则就看你的了。但是,我怀疑 whatever == TRUE语法是否会使那些知道它们在做什么的人感到困惑。

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

如果可以指定其他类型,并且需要区分 true1"foo",那么必须使用 === true

如果你写: if(x === true),它只对 x = true 为真

如果你写: if(x),对于任何不是:”(空字符串)、 false、 null、 unDefinition、0、 NaN 的 X,它都是 true。

首先,事实是:

if (booleanValue)

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

另一方面:

if (booleanValue === true)

这将只满足 if条件,如果 booleanValue正好等于 true。没有其他真实的价值可以满足它。

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

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 

对于值 2,您可能认为 2是一个真值,因此它可以与 true相比,但是类型强制不是这样工作的。它将右手值转换为与左手值的类型相匹配,因此它将 true转换为数字 1,所以它将比较 2 == 1,这肯定不是您可能想要的。

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


因此,它实际上取决于 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;
}
...

在 Javascript 中,boolean 的概念相当模糊:

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


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

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

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

  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 中,如果第一个参数为 false,则返回它的第一个参数; 如果第一个参数为 true,则返回它的第二个参数; 因此,如果 someString未定义,则 normalizedundefined,等等。这意味着上述布尔表达式的输入都不是实际的布尔值。

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

在简单的“ if”中,变量将被强制为 Boolean,并在对象上使用 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.

但是与 = = = 进行比较没有任何类型强制,所以它们必须在没有强制的情况下是相等的。

如果你说这个对象甚至可能不是布尔型的,那么你可能需要考虑的不仅仅是 true/false。

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

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

例如:

var p=5;


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

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

enter image description here

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