小编典典

if 语句中的布尔值

all

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

我写的代码是这样的:

var booleanValue = true;

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

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

var booleanValue = true;

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

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

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

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

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

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

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


阅读 160

收藏
2022-08-19

共1个答案

小编典典

首先,事实:

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

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

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


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

if (booleanValue === true)

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

if (booleanValue)

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

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

if (booleanValue === true)

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


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