Javascript if-else运算符为什么检查不相等的差异

时间:2012-12-13 10:04:36

标签: javascript operators

好的,我已经上了很多页面,并且我已经使用了以上所有查找不等于的方法。然而,我现在的兴趣是什么,并且我已经有一段时间了。以下示例之间有什么区别,为什么有时在不同的场景中有时只有一个变体会在另一个变体上起作用,我一直试图找到一个可靠的答案,但我认为它不是那么容易的搜索。

无论如何在许多情况下我不得不做类似的事情,因为似乎没有别的办法可以解决。

if(str == bad_condition)
{
  //ignore
}
else
{
   //code to do something
}

很多时候我正在做以下任何一项

if(!str == bad_condition)
{
   //code to do something
}

if(str != bad_condition)
{
   //code to do something
}

if(str !== bad_condition)
{
   //code to do something
}

现在我想这里的最终问题是,为什么最后3个中的任何一个似乎只适用于某些事情?是否有时间和地点我应该是其中一个?或者它只是我的抽奖的随机运气,因为我通常不得不处理别人的原始代码库。我总体上很好奇,我不想引发辩论。我只想认真地了解上述任何一种用途是否存在重大差异,以及是否有什么,为什么或如何。

7 个答案:

答案 0 :(得分:3)

最后三个并不是彼此相同,你几乎肯定不想使用它们中的第一个。让我们分解它们:


if(!str == bad_condition)
{
   //code to do something
}

不要那样做。首先,评估!str,然后将结果与bad_condition进行比较。 !str的结果将是truefalse。 (如果truestr""0nullundefined,则NaN; {{ 1}}否则。)因此,除非falsebad_conditiontrue,否则您不希望false!str进行比较,如果bad_condition truefalse,通常有更好的方法来编写表达式。


if(str != bad_condition)
{
   //code to do something
}

使用"loose" equalitystrbad_condition进行比较。松散的平等是棘手的,它的规则很复杂。 "0" == 0例如true"" == 0"0" == false也是"false" == false; falsestr。如果您知道 bad_conditionif(str !== bad_condition) { //code to do something } 属于同一类型,那很好,但如果不这样做,则会遇到类型强制内容。


str

使用strict equalitybad_conditionstr进行比较。这意味着没有进行类型强制,如果bad_conditionfalse不是同一类型,则条件将始终为{{1}}。

答案 1 :(得分:2)

!===一起使用,他们只检查是否存在不关心数据类型的等式,因此会发生以下情况:

console.log([] == ""); //true

那是因为[]字符串值的计算结果为false([].toString()) - 就像空字符串一样。 (感谢Alnitak在评论中指出这一点!)

另一方!=====一起检查2个值是否相同,因此上一个示例将评估为false。 See here for the "Falsies".

console.log([] === ""); //false

!value只是否定一个变量,因此使得表达式评估为boolean true为false,反之亦然。

答案 2 :(得分:1)

我猜第一个很清楚。 str == true是一个简单检查str是否等于true的条件。在这种情况下,true也可以是一个字符串。 第二是否定。这意味着例如:

    var str = true;
    if (str == true) <---- true, cause true == true;
    if (!str == true) <---- false because !str is false and false == true is false;

第3个意思不等于,意思是:

    var str = true;
    if (str != true) <- gives us false because true not equal true is false because it actually is equal.

最后一个与第三个几乎相同。如果要比较值和变量的类型,可以使用===或!==。 这意味着如果你有

    var str = false;
    if (str === false) <- true, same value and same type (boolean).

可是:

    var str = "false";
    if (str === false) <- false

因为它的值相同但变量包含一个字符串,而不是条件请求的布尔值。如果条件如下:

    if (str === "false") it would be true again 

因为相同的值+相同的类型。

希望有所帮助

答案 3 :(得分:0)

!=!==之间的差异是类型检查。例如:

true != 0; // true
false != null; // false
false !== null; // true
false != 0; //false
false !== 0; // true

但是!str == bad_condition很奇怪。我想你想说!(str == bad_condition)。但!str是有效值。 !"test"false!""为真。

答案 4 :(得分:0)

除上述答案外,您还需要了解&#39; undefined&#39;,&#39; null&#39;和假,以及这些如何给予看似不一致的&#39;结果比较。

这篇文章看起来很有趣: http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN

答案 5 :(得分:0)

if(str == bad_condition)

此条件检查str是否等于bad_condition,它不检查等价,意味着不考虑变量的类型1将被视为与“1”相同,返回true。

if(!str == bad_condition)

这只是对前一个if语句的否定,它检查str是否不等于bad_condition。它也可以写成if(str != bad_condition)

if(str !== bad_condition)

这个条件是检查等价,意味着它比较类型和值,表达式也被否定。所以以下是正确的:

由于否定,

str = 1, bad_condition = 2返回true

str = 1, bad_condition = "1"返回true,值相同,但类型不同

str = 1, bad_condition = 1返回false,因为类型和值都相同。

答案 6 :(得分:0)

你每次都在做着根本不同的事情!


str == bad_condition

这比较了两个操作数,但确实输入了强制类型。因此,如果一个操作数是数字或字符串,则另一个操作数可能被转换,这可能会产生一些令人困惑的结果。


!str == bad_condition

在这里,您手动进行某种类型的转换。 !运算符根据某些规则从其操作数中生成一个布尔值。


str != bad_condition

这会检查不平等,但使用与==相同的强制规则。


str !== bad_condition

首先检查两个操作数的类型(没有类型强制发生!)。如果两者的类型相同,则会检查其内容。


如你所见,在每种情况下你都会比较不同的东西。根据您的具体需要,我建议您使用===!==,因为这些是最直接的比较,没有类型强制。

请注意,JavaScript将比较对象而不是内容,而是通过对象引用。所以[] === []会产生错误,因为您创建的对象不共享相同的引用!

作为类型强制的提示,请从MDN

开始
  

等于(==)

     

如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格比较。如果操作数是数字或布尔值,操作数将尽可能转换为数字;否则,如果任一操作数是字符串,则另一个操作数将转换为字符串(如果可能)。如果两个操作数都是对象,那么JavaScript会比较内部引用,当操作数引用内存中的同一个对象时,它们是相等的。