if 语句中的布尔值

IT技术 javascript semantics
2021-02-18 22:48:01

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

我写的代码是这样的:

var booleanValue = true;

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

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

var booleanValue = true;

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

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

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

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

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

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

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

6个回答

首先,事实:

if (booleanValue)

将满足if语句的任何truthy值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代码的预期值以及您希望代码如何工作。如果您事先知道它只会有 a trueorfalse值,那么将它明确地与

if (booleanValue === true)

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

if (booleanValue)

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

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

if (booleanValue === true)

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


例如,如果您查看.on()jQuery中的实现,它有一个可选的返回值。如果回调返回false,则 jQuery 将自动停止事件的传播。在这种特定情况下,由于 jQuery 只希望false在返回时停止传播,因此他们明确检查返回值,=== false因为他们不想要undefinedor0""或其他任何会自动将类型转换为 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;
    }
    ...
这个答案并不完全正确。'x == true' 对于非零数字不会成立。
2021-04-18 22:48:01
这个问题我想了好久,一直没机会找人问。如果你能看一看,我将不胜感激。stackoverflow.com/questions/32615466/...
2021-05-01 22:48:01
@Teemoh - 我明白你的意思。答案更正和澄清,我添加了一个关于类型强制的部分,并通过一个示例展示了它如何做意想不到的事情。
2021-05-06 22:48:01
我只想说“if (x)”与“if(x == true)”不同,就像您在答案的第一段中所写的那样。'if (x)' 将显式地将 'x' 转换为其布尔表示。'if (x == true)' 将使用 EcmaScript 抽象比较算法。您写道,对于任何非零数字或非空字符串或任何对象,'if (x == true)' 都为真。这是错误的。如果我用 2 而不是 1 运行您的示例,它将不起作用。
2021-05-10 22:48:01
@Teemoh - 我不明白你的评论。参见jsfiddle.net/jfriend00/89h8d8tm
2021-05-15 22:48:01

如果你写:if(x === true),它只对 x = true 成立

如果你写: if(x),那么对于任何不是:''(空字符串)、false、null、undefined、0、NaN 的x都为真

(空字符串), false, null, undefined, 0, NaN
2021-04-16 22:48:01
不要忘记NaN-0
2021-05-01 22:48:01

在普通的“if”中,变量将被强制为布尔值,并在对象上使用 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.

但是与 === 的比较没有任何类型强制,因此它们必须是相等的,没有强制。

如果您说对象甚至可能不是布尔值,那么您可能需要考虑的不仅仅是真/假。

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

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

让我改写。如果你知道它要么是真的要么是假的,那没关系。
2021-04-22 22:48:01
===比较不执行强制类型转换。所以 OP 的代码有效地测试了标志的类型。只有当值为布尔值并且为真时它才会成功。
2021-05-13 22:48:01

一般来说,省略=== true.

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

if (booleanValue)如果将执行booleanValuetruthy -比其他任何东西0false''NaNnull,和undefined

if (booleanValue === true)仅当booleanValue恰好等于时才会执行true

@aldanux:oop;我的意思是''
2021-04-22 22:48:01
这正是我想要确定的,即使我只希望 boolValue 为真或假。该变量在代码中多次设置为 true/false。我知道当我编写代码时,但是如果我一年后再次检查代码,那么它只是一个大问号,除非我重新阅读所有内容,对吗?
2021-05-04 22:48:01