Javascript if-else 运算符为什么在检查不相等时有什么区别



好的,我已经上了很多页面,我已经使用了上述所有方法来查找不等于。然而,目前是什么让我的兴趣达到顶峰,我想已经有一段时间了。是以下示例之间的区别是什么,为什么在不同情况下似乎只有一种变体会比另一种变体起作用,我一直在试图找到一个可靠的答案,但我想搜索起来并不容易。

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

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 个中的任何一个似乎只适用于某些事情?有没有时间和地点,我应该其中一个超过另一个?或者这只是我的一些随机运气,因为我通常不得不处理其他人的原始代码库。我只是总体上很好奇,我不想引发辩论。我只是想认真地知道上述任何一种的用途是否存在重大差异,以及是否存在什么以及为什么或如何。

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


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

别这样。那里发生的事情首先是评估!str,然后将结果与bad_condition进行比较。!str的结果将是truefalse.(如果str""0nullundefinedNaN,则会true;false否则。因此,除非bad_conditiontruefalse,否则您不想将!str与它进行比较,如果bad_conditiontruefalse,通常有更好的方法来编写表达式。


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

这与使用"松散"相等的bad_condition相比str。松散的平等是棘手的,其规则是复杂的。 例如,"0" == 0true的,"" == 0"0" == false也是如此;"false" == falsefalse.如果你知道strbad_condition是同一类型,那很好,但如果你不知道,你就会进入类型胁迫的东西。


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

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

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

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

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

另一方面,!=====一起检查 2 个值是否相同,因此前面的示例的计算结果为 false。请参阅此处了解"虚假"。

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

!value只是否定一个变量,因此使计算结果为boolean truefalse 的表达式,反之亦然。

我想第一个很清楚。 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 

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

希望对您有所帮助

!=!==之间的区别在于类型检查。例如:

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

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

除了上述答案之外,您还需要了解"未定义","null"和false,以及这些如何在比较中给出"看似不一致"的结果。

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

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,因为类型和值相同。

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


str == bad_condition

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


!str == bad_condition

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


str != bad_condition

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


str !== bad_condition

在这里,您首先检查两个操作数的类型(不会发生类型强制!如果两者的类型相同,则检查其内容。


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

请注意,JavaScript 不会通过内容来比较对象,而是通过对象引用来比较对象。所以[] === []产生 false,因为你创建了对象,这些对象不共享相同的引用!

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

相等 (==)

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

最新更新