好的,我已经上了很多页面,我已经使用了上述所有方法来查找不等于。然而,目前是什么让我的兴趣达到顶峰,我想已经有一段时间了。是以下示例之间的区别是什么,为什么在不同情况下似乎只有一种变体会比另一种变体起作用,我一直在试图找到一个可靠的答案,但我想搜索起来并不容易。
无论如何,在很多情况下,我不得不做类似的事情,因为似乎没有其他方法可以工作。
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
的结果将是true
或false
.(如果str
是""
、0
、null
、undefined
或NaN
,则会true
;false
否则。因此,除非bad_condition
是true
或false
,否则您不想将!str
与它进行比较,如果bad_condition
是true
或false
,通常有更好的方法来编写表达式。
if(str != bad_condition)
{
//code to do something
}
这与使用"松散"相等的bad_condition
相比str
。松散的平等是棘手的,其规则是复杂的。 例如,"0" == 0
是true
的,"" == 0
和"0" == false
也是如此;"false" == false
是false
.如果你知道str
和bad_condition
是同一类型,那很好,但如果你不知道,你就会进入类型胁迫的东西。
if(str !== bad_condition)
{
//code to do something
}
这与使用严格相等的bad_condition
相比str
。这意味着不进行类型强制,如果str
和bad_condition
不是同一类型,则条件将始终false
。
!=
和==
一起去,它们只是检查相等性而不关心数据类型,因此会发生以下情况:
console.log([] == ""); //true
这是因为[]
的字符串值计算结果为 false ([].toString()
) - 就像空字符串一样。(感谢Alnitak在他的评论中指出这一点!
另一方面,!==
和===
一起检查 2 个值是否相同,因此前面的示例的计算结果为 false。请参阅此处了解"虚假"。
console.log([] === ""); //false
!value
只是否定一个变量,因此使计算结果为boolean true
false 的表达式,反之亦然。
我想第一个很清楚。 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 会比较内部引用,这些内部引用是相等的。