2012-11-06 18 views
1

作为此问题的后续行动:Is there ever a reason to write "if (myBoolean == true)" in a JavaScript conditional? -为什么在JavaScript中使用if(myBoolean === true)是一种好的做法?

为什么在JavaScript中使用if(myBoolean === true)是一种好的做法?作为一个相对缺乏经验的JavaScript用户,我试图找出具体的真实世界的场景,最终可能会得到一个布尔值为true或可能是“truthy”值的值,以便您需要检查是否(myBoolean === true)而不是if(myBoolean)

+0

这是一个没有任何正确答案的问题,主观的。 –

回答

4

我会质疑这个问题的前提:我认为这不是一个好的做法,也不认为这是一个普遍的共识,即它是。 :-)

使用=== true的唯一原因是,如果您不确定myBoolean实际上是一个布尔值,并且您希望结果为false,如果不是。有用例,但它们非常有限。 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

如果我比较'null','0'或有时'false',我通常只使用strict equals'==='。 – Chad

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 
} 
+0

你为什么要这样做? myBoolean在这里甚至不是布尔值,它是一个有时包含true的对象... – Iain

+0

为了示例的目的:)(它可能是一个布尔值,如果该函数返回null) – mihai

+0

它在我的问题中肯定地说“真实世界情景“,而不是假设的例子。感谢您的帮助,虽然:) – Iain

0

在只空的情况下,你想这样做,但我从来没有使用过,因为它感觉像更冗长的字符串。使用它或避免它没有问题。它更多的是你想写代码的风格。

+0

这不仅仅是一种风格,比如说一个函数返回一个字符串或者“false”来表示发生了什么事情。如果你只使用'==',那么当它返回''''时,你会感到奇怪,因为''== == false'是真的。但'''=== false'不是。 '''== 0'也返回true,如果你不知道它可能会导致问题。 – Chad

0

我构建了一个稍微复杂的答案,然后意识到主要原因是在falsy值而不是真正的答案。通常,一个函数返回一种东西,并且只有一个falsy值(字符串函数的空字符串,或者数字的字符串或0)。

但是,当你不知道如果事情是确定与否,它可以启发:

waitForResponse(request, 5000); 
if(!request.ResponseValue) { 
    alert('Server failed to respond'); 
} 

VS

waitForResponse(request, 5000); 
if(request.ResponseValue === 'false') { 
    alert('Server says no'); 
} 

虽然我认为你应该检查未定义而不是boolyness:

if(typeof request.ResponseValue === 'undefined') { 
    //... 
} 

顺便说一句,typeof快,至少它是在Chrome上次我查了一下。

0

个人而言,我不喜欢像这样的陈述,这是x的良好做法。国际海事组织,这一切都取决于上下文:如果你想检查一些对象存在,if(objectX)将尽可能if (objectX === undefined)if (typeof objectX === 'undefined')甚至if (typeof objectX == 'undefined')

之所以有些人,像道格拉斯·克罗克福德,大力提倡使用的价值和类型检查(===)是falsy和truthy值,在极少数情况下,产生意想不到的结果:

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 
} 

再次,这可能只是我的看法,但在绝大多数情况下,这不会破坏你的代码。我甚至会走一步:道格拉斯Crockford的可能声称,使用检查falsy值是不是一个好主意,但他确实像逻辑OR(||)操作:

var falsy =''; 
var someVar = falsy || 'default value';//this relies heavily on falsy values 

唯一“实“参数进行严格的比较是:

  • 如果你需要变量是一个布尔值,但随后又falsy = !!falsy;强制转换为布尔都是一样的
  • 严格的比较是轻微更快,但你必须做很多比较,然后才能注意到区别

话虽如此,我确实倾向于使用严格的比较非常多,再次,它可能是个人的事情,但我喜欢知道变量的实际类型是什么:
鉴于'1' == 1计算结果为真实的,但'1' === 1是假的,它至少可以让你强迫一个变种到您需要的类型:

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 ...在你的控制台中试用它,你很快就会看到我在做什么。

+0

您的第一条if语句不正确。该日志不会运行,因为''''是虚假的,所以if语句失败。第二个将成功并运行日志。 – Chad

+0

@查德,你是对的......这就是我想说清楚的,但我没有澄清在这种情况下可能被视为违反直觉的东西,编辑我的答案 –

+0

啊!现在更有意义:P – Chad

相关问题