首先,事实是:
if (booleanValue)
if
对于任何真实值(booleanValue
包括true
,任何非零数字,任何非空字符串值,任何对象或数组引用等),将满足该语句。
另一方面:
if (booleanValue === true)
if
如果booleanValue
正好等于,这将满足条件true
。没有其他真实的价值能够满足它。
另一方面,如果您这样做:
if (someVar == true)
然后,Javascript将要做的是键入强制类型true
以匹配的类型,someVar
然后比较两个变量。在很多情况下,这可能不是人们想要的。因此,在大多数情况下,您都想避免使用,==
因为关于Java语言如何强制将两种类型的内容强制转换为同一类型的规则很长,除非您了解所有这些规则并且可以预期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
对于值2
,您会认为这2
是一个真实值,因此可以与相比,这是正确的值true
,但这不是类型强制的工作原理。它正在转换右手值以匹配左手值的类型,因此将其转换true
为数字,1
以便进行比较2 == 1
,这肯定不是您可能想要的。
因此,买家要当心。==
除非您明确知道要比较的类型,并且知道所有可能的类型强制算法如何工作,否则最好避免在几乎所有情况下使用。
因此,它实际上取决于期望值booleanValue
以及您希望代码如何工作。如果您事先知道它只会有一个true
或false
值,则将其与
if (booleanValue === true)
只是多余的代码,是不必要的,
if (booleanValue)
更紧凑,可以说更清洁/更好。
另一方面,如果您不知道booleanValue
可能是什么,并且想要测试是否将其设置为true 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;
}
...