首先,事实:
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
以及您希望代码如何工作。如果您事先知道它只会有一个true
orfalse
值,那么将它明确地与
if (booleanValue === true)
只是额外的代码和不必要的
if (booleanValue)
更紧凑,可以说更清洁/更好。
另一方面,如果您不知道booleanValue
可能是什么并且您想测试它是否真的设置为true
不允许其他自动类型转换,那么
if (booleanValue === true)
不仅是一个好主意,而且是必需的。
例如,如果您查看.on()
jQuery 中的实现,它有一个可选的返回值。如果回调返回false
,则 jQuery 将自动停止事件的传播。在这种特定情况下,由于 jQuery 只想false
在返回时停止传播,因此他们明确检查返回值,=== false
因为他们不希望undefined
or 0
or""
或任何其他会自动类型转换为 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;
}
...