作为此问题的后续问题:Is there ever a reason to write "if (myBoolean == true)" in a JavaScript conditional? -
为什么在JavaScript中使用if(myBoolean === true)是一种好习惯?作为一个相对缺乏经验的JavaScript用户,我正在尝试在特定的,真实世界的场景中找到一个可能是布尔值或者可能是“真实”值的值,以便您需要检查是否(myBoolean === true)而不是if(myBoolean)
答案 0 :(得分:4)
我会质疑这个问题的前提:我不认为这是好的做法,我也不认为这是一个普遍的共识。 : - )
使用=== 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
......
答案 1 :(得分:0)
一些随机的例子:
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
}
答案 2 :(得分:0)
如果只是null,你想要这样做,虽然我从来没有使用过它,因为它感觉就像更冗长和更长的字符串。使用它或避免使用它没有问题。你想要编写代码的风格更多。
答案 3 :(得分:0)
我构建了一个稍微复杂的答案然后意识到主要原因是虚假的价值而不是真实的价值观。通常,函数返回一种东西,并且只有一个假值(字符串函数的空字符串,或数字的0或其他)。
但是,如果您不确定是否定义了某些内容,则可能具有指导意义:
waitForResponse(request, 5000);
if(!request.ResponseValue) {
alert('Server failed to respond');
}
VS
waitForResponse(request, 5000);
if(request.ResponseValue === 'false') {
alert('Server says no');
}
虽然我认为你应该检查undefined而不是boolyness:
if(typeof request.ResponseValue === 'undefined') {
//...
}
顺便提一下,typeof
很快,至少在我上次检查时是在Chrome中。
答案 4 :(得分:0)
就个人而言,我不喜欢像这样的陈述,这是x 的好习惯。 IMO,这完全取决于上下文:如果您想检查某个对象是否存在,if(objectX)
将与if (objectX === undefined)
或if (typeof objectX === 'undefined')
甚至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
}
同样,这可能只是我的观点,但在绝大多数情况下,这不会破坏您的代码。我甚至更进一步:道格拉斯·克罗克福德可能声称使用检查虚假值不是一个好主意,但他确实喜欢逻辑OR(||
)运算符:
var falsy ='';
var someVar = falsy || 'default value';//this relies heavily on falsy values
严格比较的唯一“solid”参数是:
falsy = !!falsy;
强制一个布尔值全部相同话虽如此,我确实倾向于使用严格的比较,同样,它可能是个人的事情,但我喜欢知道变量的实际类型是什么:
鉴于'1' == 1
的计算结果为true,但'1' === 1
为false,它至少允许您将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
...在你的控制台中尝试一下,你很快就能看到我在谈论的内容。