为什么在JavaScript中使用if(myBoolean === true)是一种好习惯?

时间:2012-11-06 12:04:28

标签: javascript

作为此问题的后续问题:Is there ever a reason to write "if (myBoolean == true)" in a JavaScript conditional? -

为什么在JavaScript中使用if(myBoolean === true)是一种好习惯?作为一个相对缺乏经验的JavaScript用户,我正在尝试在特定的,真实世界的场景中找到一个可能是布尔值或者可能是“真实”值的值,以便您需要检查是否(myBoolean === true)而不是if(myBoolean)

5 个答案:

答案 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是一个字符串,是直接检查fooif (foo === +(foo))
我很清楚这个例子有点牵强,但我遇到了一个与此案非常相似的案例。在这种情况下,强类型语言的优势确实显示出来。说到:new Date() >= someDateObject vs Date() >= someDateObject ...在你的控制台中尝试一下,你很快就能看到我在谈论的内容。