nic*_*ckf 483 php comparison equality operators identity-operator
==
和之间有什么区别===
?
==
比较究竟是如何运作的?===
比较究竟是如何运作的?什么是有用的例子?
nic*_*ckf 611
==
和之间的区别===
松散==
相等的运算符和严格===
相同的运算符之间的区别在手册中有详细解释:
比较运算符
???????????????????????????????????????????????????????????????????????????????????? ? Example ? Name ? Result ? ???????????????????????????????????????????????????????????????????????????????????? ?$a == $b ? Equal ? TRUE if $a is equal to $b after type juggling. ? ?$a === $b ? Identical ? TRUE if $a is equal to $b, and they are of the same type. ? ????????????????????????????????????????????????????????????????????????????????????
==
比较宽松如果您正在使用==
运算符,或者使用松散比较的任何其他比较运算符!=
,<>
或者==
,您始终必须查看上下文,以查看某些内容转换为什么,在哪里以及为什么要了解正在发生的事情.
作为参考和示例,您可以在手册中看到比较表:
松散的比较
==
????????????????????????????????????????????????????????????????????????????????????????????????????????????? ? ? TRUE ? FALSE ? 1 ? 0 ? -1 ? "1" ? "0" ? "-1" ? NULL ? array() ? "php" ? "" ? ????????????????????????????????????????????????????????????????????????????????????????????????????????????? ? TRUE ? TRUE ? FALSE ? TRUE ? FALSE ? TRUE ? TRUE ? FALSE ? TRUE ? FALSE ? FALSE ? TRUE ? FALSE ? ? FALSE ? FALSE ? TRUE ? FALSE ? TRUE ? FALSE ? FALSE ? TRUE ? FALSE ? TRUE ? TRUE ? FALSE ? TRUE ? ? 1 ? TRUE ? FALSE ? TRUE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? 0 ? FALSE ? TRUE ? FALSE ? TRUE ? FALSE ? FALSE ? TRUE ? FALSE ? TRUE ? FALSE ? TRUE ? TRUE ? ? -1 ? TRUE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? ? "1" ? TRUE ? FALSE ? TRUE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? "0" ? FALSE ? TRUE ? FALSE ? TRUE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? "-1" ? TRUE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? ? NULL ? FALSE ? TRUE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? TRUE ? FALSE ? TRUE ? ? array() ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? TRUE ? FALSE ? FALSE ? ? "php" ? TRUE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? ? "" ? FALSE ? TRUE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? TRUE ? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????
===
相同的比较如果您正在使用===
运算符或任何其他使用严格比较的比较运算符(如!==
或)===
,那么您始终可以确保类型不会神奇地改变,因为不会进行转换.因此,通过严格比较,类型和值必须相同,而不仅仅是值.
作为参考和示例,您可以在手册中看到比较表:
严格比较
===
????????????????????????????????????????????????????????????????????????????????????????????????????????????? ? ? TRUE ? FALSE ? 1 ? 0 ? -1 ? "1" ? "0" ? "-1" ? NULL ? array() ? "php" ? "" ? ????????????????????????????????????????????????????????????????????????????????????????????????????????????? ? TRUE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? 1 ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? 0 ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? -1 ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? "1" ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? "0" ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? ? "-1" ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? FALSE ? ? NULL ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? FALSE ? ? array() ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? FALSE ? ? "php" ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? FALSE ? ? "" ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE ? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????
Pat*_*ien 237
如果运算符不同,则运算符==在两种不同类型之间进行转换,而===运算符执行"类型安全比较".这意味着如果两个操作数具有相同的类型和相同的值,它将仅返回true.
例子:
1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value
Run Code Online (Sandbox Code Playgroud)
警告:具有等效成员的同一类的两个实例与===
运算符不匹配.例:
$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)
Run Code Online (Sandbox Code Playgroud)
Eri*_*ski 79
一张图片胜过千言万语:
==
平等图:===
Equality图表:创建这些图像的源代码:
https://github.com/sentientmachine/php_equality_charts
那些希望保持理智的人,不要再读了.
NAN != NAN
尽可能将左右操作数转换为数字NAN == true
,但是==
123 == "123foo"
是不可传递的,因为"123" != "123foo"
,==
但是"0"== 0
0 == ""
,"0" != ""
和,==
但"6" == " 6"
因为"4.2" == "4.20"
是八进制.但"133" == "0133"
与133 != 0133
尚未声明的PHP变量为false.
"0x10" == "16"
,"1e3" == "1000"
,False == 0
和""
.
如果您使用PHP,则不应使用double equals运算符,始终使用triple equals.
小智 39
关于JavaScript:
===运算符与==运算符的作用相同,但它要求其操作数不仅具有相同的值,而且还具有相同的数据类型.
例如,下面的示例将显示'x和y相等',但不是'x和y相同'.
var x = 4;
var y = '4';
if (x == y) {
alert('x and y are equal');
}
if (x === y) {
alert('x and y are identical');
}
Run Code Online (Sandbox Code Playgroud)
sou*_*rge 22
关于对象比较的其他答案的补充:
==使用对象的名称及其值来比较对象.如果两个对象具有相同的类型且具有相同的成员值,则$a == $b
产生true.
===比较对象的内部对象id.即使成员是平等的,$a !== $b
如果它们不是完全相同的对象.
class TestClassA {
public $a;
}
class TestClassB {
public $a;
}
$a1 = new TestClassA();
$a2 = new TestClassA();
$b = new TestClassB();
$a1->a = 10;
$a2->a = 10;
$b->a = 10;
$a1 == $a1;
$a1 == $a2; // Same members
$a1 != $b; // Different classes
$a1 === $a1;
$a1 !== $a2; // Not the same object
Run Code Online (Sandbox Code Playgroud)
sil*_*ver 12
简单来说:
==检查是否等效(仅限值)
===检查是否相同(值&&类型)
等价与相同:类比
1 + 1 = 2 + 0(相当于)
1 + 1 = 1 + 1(相同)
在PHP中:
true == 1(true - 等值)
true === 1(false - 值&&类型不一样)
小智 8
这都是关于数据类型的.以BOOL
(真或假)为例:
true
也等于1
,
false
也等于0
在==
比较时,并不关心数据类型:所以,如果你有一个变量,它是1(也可能是true
):
$var=1;
然后比较==
:
if ($var == true)
{
echo"var is true";
}
Run Code Online (Sandbox Code Playgroud)
但$var
实际上并不相同true
,是吗?它具有1
相反的int值,而int值又等于true.
使用===
,检查数据类型以确保两个变量/对象/使用相同类型的任何内容.
所以,如果我这样做
if ($var === true)
{
echo "var is true";
}
Run Code Online (Sandbox Code Playgroud)
这种情况不会是真的,因为$var !== true
它只是== true
(如果你知道我的意思).
你为什么需要这个?
简单 - 让我们来看看PHP的一个功能array_search()
:
该array_search()
函数只是在数组中搜索一个值,并返回找到该值的元素的键.如果在数组中找不到该值,则返回false.但是,如果你array_search()
对存储在数组的第一个元素中的值(它将具有数组键0
)进行了操作,array_search()
那么该函数将返回0 ...等于false.
所以,如果你这样做:
$arr = array("name");
if (array_search("name", $arr) == false)
{
// This would return 0 (the key of the element the val was found
// in), but because we're using ==, we'll think the function
// actually returned false...when it didn't.
}
Run Code Online (Sandbox Code Playgroud)
所以,你现在看到这可能是一个问题吗?
大多数人== false
在检查函数是否返回false时不使用.相反,他们使用!
.但实际上,这与使用完全相同==false
,所以如果你这样做:
$arr = array("name");
if (!array_search("name", $arr)) // This is the same as doing (array_search("name", $arr) == false)
Run Code Online (Sandbox Code Playgroud)
所以对于这样的事情,你会使用===
而不是,以便检查数据类型.
一个例子是数据库属性可以为null或"":
$attributeFromArray = "";
if ($attributeFromArray == ""){} //true
if ($attributeFromArray === ""){} //true
if ($attributeFromArray == null){} //true
if ($attributeFromArray === null){} //false
$attributeFromArray = null;
if ($attributeFromArray == ""){} //true
if ($attributeFromArray === ""){} //false
if ($attributeFromArray == null){} //true
if ($attributeFromArray === null){} //true
Run Code Online (Sandbox Code Playgroud)