1

好吧,我翻了这么多页,上面所有的查找不等于的方法我都用过了。然而,我猜目前是什么使我的兴趣达到顶峰并且已经有一段时间了。以下示例之间有什么区别,为什么有时在不同的场景中只有一种变体会比另一种更有效,我一直在努力寻找一个可靠的答案,但我想这并不容易搜索。

无论如何,在许多情况下,我不得不做类似的事情,因为似乎没有其他方法可以工作。

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
}

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

4

7 回答 7

3

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


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

不要那样做。发生的事情首先!str是评估 ,然后将其结果与 进行比较bad_condition。的结果!str将是truefalse。(它会是trueif stris "", 0, null, undefined, or NaN;false否则。)所以除非bad_conditiontrueor false,你不想!str和它比较,如果bad_condition trueor false,通常有更好的方法来编写表达式。


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

这与str使用bad_condition松散”的相等性相比。松散的平等是棘手的,它的规则很复杂。"0" == 0true, 例如 ,"" == 0"0" == false; "false" == falsefalse。如果你知道两者strbad_condition是相同的类型,那很好,但如果你不知道,你就会陷入类型强制的事情。


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

这与str使用bad_condition严格相等相比。这意味着没有进行类型强制,如果strbad_condition不是同一类型,则条件将始终为false.

于 2012-12-13T10:10:36.247 回答
2

!=一起==去,他们只是检查是否相等而不关心数据类型,所以会发生以下情况:

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

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

另一方面!=====一起检查 2 个值是否相同,因此前面的示例将评估为 false。请参阅此处了解“Falsies”。

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

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

于 2012-12-13T10:08:42.080 回答
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;

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

    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 

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

希望能帮助到你

于 2012-12-13T10:26:19.630 回答
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而且!""是真的。

于 2012-12-13T10:09:02.587 回答
0

除了上述答案之外,您还需要了解“未定义”、“空”和“假”以及它们如何在比较中给出“看似不一致”的结果。

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

于 2012-12-13T10:11:40.770 回答
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,因为类型和值都相同。

于 2012-12-13T10:12:51.860 回答
0

你每次都在这里做完全不同的事情!


str == bad_condition

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


!str == bad_condition

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


str != bad_condition

这将检查不等式,但具有与 相同的强制规则==


str !== bad_condition

在这里,您首先检查两个操作数的类型(没有类型强制发生!)。如果两者属于同一类型,则检查它们的内容。


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

请注意,JavaScript 将不按内容比较对象,而是按对象引用。所以[] === []yield false,因为你创建的对象不共享相同的引用!

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

相等 (==)

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

于 2012-12-13T10:13:13.123 回答