作为这个问题的后续:是否有理由在 JavaScript 条件中编写“if (myBoolean == true)”?-
为什么在 JavaScript 中使用 if (myBoolean === true) 是个好习惯?作为一个相对缺乏经验的 JavaScript 用户,我试图弄清楚在哪些特定的现实世界场景中,您最终会得到一个可能是布尔真值或“真实”值的值,以便您需要检查 if (myBoolean === true) 而不是 if (myBoolean)
作为这个问题的后续:是否有理由在 JavaScript 条件中编写“if (myBoolean == true)”?-
为什么在 JavaScript 中使用 if (myBoolean === true) 是个好习惯?作为一个相对缺乏经验的 JavaScript 用户,我试图弄清楚在哪些特定的现实世界场景中,您最终会得到一个可能是布尔真值或“真实”值的值,以便您需要检查 if (myBoolean === true) 而不是 if (myBoolean)
我将挑战这个问题的前提:我认为这不是好的做法,我也不认为这是一个普遍的共识。:-)
使用的唯一原因=== true
是如果您不确定它myBoolean
实际上是一个布尔值,并且如果不是,您希望结果为假。有一些用例,但它们非常有限。99.9% 的情况下,就if (myBoolean)
足够了,即使对于1
、"foo"
和其他真实值也是如此。
有时出于其他原因使用严格相等是个好主意,因为如果操作数属于不同类型,JavaScript 的松散相等规则非常复杂。但是,如果您将某物用作标志,那么使用===
它几乎没有任何意义。
我见过===
使用布尔值的一个特殊地方是在受 jQuery 启发的代码中,其中回调函数可以通过返回来取消操作false
,但不必返回任何内容。当一个函数没有明确的返回值时,调用该函数的结果是undefined
,这当然是错误的。所以想要检查函数是否返回的代码false
,而不仅仅是undefined
,会这样做:
if (callback(args) === false) {
// The callback explicitly returned false (not just a falsey value), cancel
// ...
}
但这是一个相对不常见的用例,当然它涉及=== false
而不是=== true
......
我构建了一个稍微复杂的答案,然后意识到主要原因在于虚假值而不是真实值。通常,一个函数返回一种东西,并且只有一个假值(字符串函数的空字符串,或数字的 0,或其他)。
但是,当您不确定是否定义了某些内容时,它可能具有指导意义:
waitForResponse(request, 5000);
if(!request.ResponseValue) {
alert('Server failed to respond');
}
对比
waitForResponse(request, 5000);
if(request.ResponseValue === 'false') {
alert('Server says no');
}
虽然我认为你应该检查 undefined 而不是 boolyness:
if(typeof request.ResponseValue === 'undefined') {
//...
}
顺便说一句,typeof
速度很快,至少我上次检查时是在 Chrome 中。
一些随机的例子:
function CreateSomeObject(param)
{
if (param == "1")
{
return new Stuff();
}
return null;
}
var myBoolean = CreateSomeObject("1") || true;
if (myBoolean === true)
{
//doesn't execute
}
if (myBoolean)
{
//executes just fine
}
在 null only 的情况下,您想这样做,尽管我从未使用过它,因为它感觉更像是冗长和长字符串。使用它或避免它都没有问题。您想要编写代码更多的是风格。
就个人而言,我不喜欢这样的陈述,比如 x 是好的做法。IMO,这完全取决于上下文:如果您想检查某个对象是否存在,if(objectX)
将执行 as if (objectX === undefined)
orif (typeof objectX === 'undefined')
和 even if (typeof objectX == 'undefined')
。
像 Douglas Crockford 这样的人强烈主张使用值和类型检查 ( ===
) 的原因是,虚假和真实值在极少数情况下会产生意想不到的结果:
var falsy = '';
if (falsy)
{//only when falsy is truthy, but an empty string is falsy
console.log('could be seen as counter-intuitive: var was declared and assigned an empty string, but is falsy');
}
var obj = {falsy:''}
if (!obj.falsy)
{
console.log('I might assume falsy is not set, although it was:');
console.log(obj.hasOwnProperty('falsy'));//true
}
同样,这可能只是我的意见,但在绝大多数情况下,这不会破坏您的代码。我什至会更进一步:Douglas Crockford 可能会声称使用检查虚假值不是一个好主意,但他确实喜欢逻辑 OR ( ||
) 运算符:
var falsy ='';
var someVar = falsy || 'default value';//this relies heavily on falsy values
严格比较的唯一“可靠”论据是:
falsy = !!falsy;
强制转换为布尔值话虽如此,我确实倾向于使用严格的比较,这可能是个人的事情,但我想知道变量的实际类型是什么:
鉴于'1' == 1
计算结果为真,但'1' === 1
为假,它在至少允许您将 var 强制为您需要的类型:
var foo = '00001';
var elements = [foo = ('00000' + (+(foo)+1)).substr(-5)];
while(elements[+(foo)-1])
{
foo = ('00000' + (+(foo)+1)).substr(-5);
elements.push(foo = ('00000' + (+(foo)+1)).substr(-5));
}
现在这不是你所说的好代码,但是有很多类型的杂耍正在进行。在旅程结束时,您可能想知道分配给 的值是什么foo
。这不是此代码段中的问题,但假设您想在 while 循环中使用 foo 的数值,如果它是奇数:
var foo = '00001';
var elements = [foo = ('00000' + (+(foo)+1)).substr(-5)];
while(elements[+(foo)-1])
{
foo = ('00000' + (+(foo)+1)).substr(-5);
elements.push(foo = ('00000' + (+(foo)+1)).substr(-5));
if (+(foo)%2 === 1)
{
foo = +(foo);
//do stuff with foo
}
}
最简单的判断天气与否的方法foo
是在循环完成后foo
直接检查:if (foo === +(foo))
我很清楚这个例子有点牵强,但我遇到过一个和这个很相似的案例。有时,强类型语言的优势才真正显现出来。说到这:new Date() >= someDateObject
vs Date() >= someDateObject
...在您的控制台中尝试一下,您很快就会看到我在说什么。