为什么要使用!!将变量强制转换为布尔值,以在条件表达式中使用?

28 浏览
0 Comments

为什么要使用!!将变量强制转换为布尔值,以在条件表达式中使用?

!!x将变量x的类型强制转换为布尔型,同时保持其真值或非真值 - 参见此问题 - 我对其在条件表达式中的使用有疑问。\n在一些JS代码中,我曾看到!!用于将变量强制转换为布尔型,如下所示:\n

if(!!x) {
    x.doStuff();
}

\n这里的想法是在调用其方法之前测试x是否已定义。\n但是,在我的代码中,我一直只使用:\n

if(x) {
    x.doStuff();
}

\n基于这样的前提,如果x被定义,条件将通过,如果x未定义,则条件将不会通过。\n因此,我的问题是在这种情况下,使用!!x强制转换为布尔型有何意义? 这段代码这段代码有何不同?

0
0 Comments

将一个变量强制转换为布尔值,以在条件表达式中使用,使用!!。这种方法和if(x)没有太大区别。然而,这两种方法都有一些问题,比如它们会将0转换为false等等。

if (myValue !== null && myValue !== undefined)if (myValue) {}是不同的。

因此,不要仅仅通过检查if(x)if(!!x)来进行空值检查,因为这样会产生歧义。

解决方法是使用严格的等于运算符!==来进行空值检查,如if (myValue !== null && myValue !== undefined)。这样可以确保只有在变量不为nullundefined时才执行相应的代码。

使用!!的主要原因是将一个值强制转换为布尔值。当我们需要在条件语句中使用一个变量时,我们通常需要将其转换为布尔值。这是因为条件语句只能接受布尔值作为参数。所以,通过使用!!可以将任何值转换为布尔值。这对于确保我们在条件语句中使用正确的变量非常有用。

0
0 Comments

在JavaScript中,有时我们需要将变量强制转换为布尔值,以便在条件表达式中使用。这涉及到JavaScript的类型转换。

通常情况下,我们希望检查一个对象是否不为null、不为undefined、不为0等。常见的做法是使用以下代码进行检查:

if (obj) {
  ...
}

然而,如果我们希望条件等于true或false,可以对非布尔对象实例使用!。下面是一个例子,使用了不进行类型转换的相等运算符===

var obj = {};
console.log(obj === true); // 返回false
console.log(!obj === false); // 返回true
console.log(!!obj === true); // 返回true

从上面的例子可以看出,使用单个!运算符可以将对象转换为布尔值,并返回与原始条件相反的结果。而使用两个!!运算符则可以将对象转换为布尔值,并返回与原始条件相同的结果。

这种方法的出现是为了简化代码,并能够更直观地判断一个对象的真假。通过使用!!运算符,我们可以避免繁琐的条件判断,同时保持代码的可读性和简洁性。

总结起来,使用!!将变量强制转换为布尔值的方法可以简化代码,并且能够更直观地判断一个对象的真假。

0
0 Comments

在特定的上下文中,使用!!将变量转换为布尔值以在条件表达式中使用与让if表达式自然转换为布尔值没有区别。我所指的是if (x)将被解释为if (Boolean(x)),这与if (!!x)是相同的。

然而,如果你从一个函数中返回一个值,例如,如果你想要实现一个arrayHasItems函数,你可以这样实现:

function arrayHasItems(arr) {
    return arr.length;
}

在if语句中使用该函数将会成功,因为从函数返回的数值将会被转换为布尔值。然而,客户端代码期望该函数返回一个布尔值,所以他可能通过以下方式来检查条件:

if (arrayHasItems(arr) === true) {}

在这种情况下,它将会失败,因为arrayHasItems返回的结果是一个数字。

因此,更好的做法是按照预期返回一个布尔值来实现该函数:

function arrayHasItems(arr) {
    return !!arr.length;
}

编辑:

这引出了一个新问题:为什么使用!!arr.length而不仅仅是arr.length > 0

在产生的结果方面,两者之间没有任何区别,而且你甚至没有节省字节,因为两个语句所占用的字符数是相同的。然而,我创建了一个测试用例,发现双重否定似乎表现更好,但在所有浏览器中可能不一致。

这引出了一个新问题:为什么使用!!arr.length而不仅仅是arr.length > 0?我更新了答案,双重否定似乎表现更好。

0