if 语句中的布尔值

2022-08-30 01:56:12

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

我写的代码是这样的:

var booleanValue = true;

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

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

var booleanValue = true;

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

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

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

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

所以我的问题;将来是否更整洁地丢失“=== true”部分,或者检查变量的类型是否也是一种很好的做法。

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

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


答案 1

首先,事实:

if (booleanValue)

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

另一方面:

if (booleanValue === true)

仅当 正好等于 时,这才会满足条件。没有其他真理价值可以满足它。ifbooleanValuetrue

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

if (someVar == true)

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

举个例子,说明它可能是多么令人困惑:

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 

对于该值,您会认为这是一个真值,因此它可以与 有利地比较,但这不是类型强制的工作原理。它正在转换右手值以匹配左手值的类型,因此它转换为数字,因此它正在比较,这肯定不是您可能想要的。22truetrue12 == 1

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


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

if (booleanValue === true)

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

if (booleanValue)

更紧凑,可以说更干净/更好。

另一方面,如果您不知道可能是什么,并且想要测试它是否确实设置为不允许其他自动类型转换,则booleanValuetrue

if (booleanValue === true)

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


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

例如,下面是 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;
    }
    ...

答案 2

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

如果你写:,对于任何不是:''(空字符串),false,null,undefined,0,NaN的x,它将是真的。if(x)