比较运算符 "!== " 与 "!= " 的区别

6
我知道!==用于比较变量类型,而!=仅比较值。
但我看到很多人在比较值时使用!==,例如:
$stuff = 'foo';
if($stuff !== 'foo') // do...

他们这样做有什么原因吗?是 !==!= 更快吗?


4
根据特定情况使用逻辑上合适的方法。不要因为“性能”而偏好一种方法。 - kapa
1
可能是PHP中!==和!=之间有什么区别吗?的重复问题。 - Gordon
7个回答

14

!= 不仅比较值,还会比较类型,必要时进行类型转换(参见各种类型比较表),然后再比较(转换后的)值。所以说认为 != 只比较值是不正确的。

相比之下,如果类型不相等且不执行类型转换,!== 则在更早的阶段失败。


1
举个极端的例子:在 PHP 中 0 == 'string' - NikiC

5
!= 操作符需要进行必要的隐式转换,因此速度稍慢,
!== 会先比较类型,然后再比较值(仅在类型相等时才比较)。
另外,有关这两个操作数之间的差异的更多信息,请参考此答案

1
请看下面我的评论,了解有关性能参数的演示。 - BenMorel
@Benjamin 在查看问题时,答案的随机放置很可能使你阅读这条评论时它已经在上方了,但当你读到这句话时,它可能已经在下方了! - Zoidberg
@Zoidberg:没错,我也意识到得太晚了 :) 让我们把它改成“看看我的评论”,句号。 - BenMorel

3
如果您事先知道两个变量是相同类型的,则不会有任何区别。我认为速度差异非常微小,速度论点可以(并且应该)完全忽略,您应该专注于您的应用程序,而不是专注于过早(和不必要的)优化。
但是,如果您确实需要一个参数与您期望的完全相同(例如,当您不希望0通过等式测试时,“=== false”),则使用“===”或“!==”。
正如Headshota所提到的,如果您正在处理对象,则“===”检查这两个变量是否实际指向相同的对象实例,而“==”尝试按值匹配它们,这可能会导致意外结果,应谨慎使用。在这里,将使用严格运算符,因为它对应用程序具有意义。
回答您的问题,如果在您特定的上下文中,一些人在您知道两个变量都是相同(标量)类型的情况下使用“===”或“!==”,那么我想这只是一种编码风格,并在代码中显示了一些严格性,强制执行两个变量都是相同类型的想法,可能并不考虑性能。
当它有意义时必须使用严格操作符,而不是作为性能优化。
更新:为了回答速度论点,让我们考虑这个小基准测试:
$a = "test";
$b = "test";

$t = microtime(true);
for ($i=0; $i<1e6; $i++) {
    ($a == $b);
    // (100x the equality test, omitted for clarity purposes,
    //  to lower the speed impact of the loop itself)
    ($a == $b);
}
printf('%.3f', microtime(true)-$t);

I roughly get:

6.6 seconds for ==
4.3 seconds for ===

现在,如果我使用$b = 1;强制进行隐式转换,大致会得到以下结果:
4.4 seconds for ==
2.4 seconds for ===

这意味着在两种情况下大约可以节省2秒的时间。你可能会认为,在某种程度上这证明了严格比较运算符的速度优势,这是正确的。但不要忘记我们正在谈论1e6 * 100=1亿次迭代。
这意味着单个严格比较将使您的脚本加速0.00000002秒
如果您认为在编写脚本时应该考虑这一点,请这样做。但很快您就会遇到其他微小的优化,这将使您获得比此类“优化”更高1000倍的速度增益。这是过早优化的典型案例。
再次强调,如果您必须使用严格比较运算符,请使用它,因为这是您代码的要求。不要出于性能原因使用它。

2

实际上,!== 不用于比较变量类型,它用于确保被比较的值与类型都相同。

因此,如果你有以下代码:

$i = "0";

$i == 0会返回真,而$i === 0则会返回假。

如果你有:

$j = 0;

$j == null返回true,而$j === null返回false。


2

在你的例子中,如果你知道类型是相同的,那么使用!==并不会更快。人们使用!==的主要原因是它可以防止PHP进行类型转换魔法,所以比较结果不会意外产生。


2
For example

$flag = 0;
if($flag == false ){
   echo "true";
}else{
   echo "false";
}                      // echo true;


$flag = 0;
if($flag === false ){
   echo "true";
}else{
   echo "false";
}                     // echo false;


$flag = false;
if($flag === false ){
   echo "true";
}else{
   echo "false";
}                    // echo true

1

通常来说,检查身份比检查相等更安全,这可以避免由无效类型引起的许多错误。但是在某些情况下,身份并不是必须的,因此您可以在这些情况下使用相等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接