为什么要使用!!将变量强制转换为布尔值,以在条件表达式中使用?
为什么要使用!!将变量强制转换为布尔值,以在条件表达式中使用?
!!x
将变量x
的类型强制转换为布尔型,同时保持其真值或非真值 - 参见此问题 - 我对其在条件表达式中的使用有疑问。\n在一些JS代码中,我曾看到!!
用于将变量强制转换为布尔型,如下所示:\n
if(!!x) { x.doStuff(); }
\n这里的想法是在调用其方法之前测试x
是否已定义。\n但是,在我的代码中,我一直只使用:\n
if(x) { x.doStuff(); }
\n基于这样的前提,如果x
被定义,条件将通过,如果x
未定义,则条件将不会通过。\n因此,我的问题是在这种情况下,使用!!
将x
强制转换为布尔型有何意义? 这段代码与这段代码有何不同?
将一个变量强制转换为布尔值,以在条件表达式中使用,使用!!
。这种方法和if(x)
没有太大区别。然而,这两种方法都有一些问题,比如它们会将0
转换为false
等等。
if (myValue !== null && myValue !== undefined)
和if (myValue) {}
是不同的。
因此,不要仅仅通过检查if(x)
或if(!!x)
来进行空值检查,因为这样会产生歧义。
解决方法是使用严格的等于运算符!==
来进行空值检查,如if (myValue !== null && myValue !== undefined)
。这样可以确保只有在变量不为null
或undefined
时才执行相应的代码。
使用!!
的主要原因是将一个值强制转换为布尔值。当我们需要在条件语句中使用一个变量时,我们通常需要将其转换为布尔值。这是因为条件语句只能接受布尔值作为参数。所以,通过使用!!
可以将任何值转换为布尔值。这对于确保我们在条件语句中使用正确的变量非常有用。
在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
从上面的例子可以看出,使用单个!
运算符可以将对象转换为布尔值,并返回与原始条件相反的结果。而使用两个!!
运算符则可以将对象转换为布尔值,并返回与原始条件相同的结果。
这种方法的出现是为了简化代码,并能够更直观地判断一个对象的真假。通过使用!!
运算符,我们可以避免繁琐的条件判断,同时保持代码的可读性和简洁性。
总结起来,使用!!
将变量强制转换为布尔值的方法可以简化代码,并且能够更直观地判断一个对象的真假。
在特定的上下文中,使用!!
将变量转换为布尔值以在条件表达式中使用与让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
?我更新了答案,双重否定似乎表现更好。