В чем разница между ==
а также ===
?
==
Сравнительная работа?===
Сравнительная работа? Какие были бы полезные примеры?
Разница между слабо ==
оператор равенства и строгий ===
идентичный оператор точно объясняется в руководство:
Операторы сравнения
┌──────────┬───────────┬────────────────────────── ─────────────────────────────────┐ │ Пример │ Имя │ Результат │ ├──────────┼───────────┼────────────────────────── ─────────────────────────────────┤ A $ a == $ b │ Равен │ ИСТИНА, если $ a равно жонглированию типов. │ A $ a === $ b │ Одинаково │ ИСТИНА, если $ a равно $ b и они одного типа. │ └──────────┴───────────┴────────────────────────── ─────────────────────────────────┘
Если вы используете ==
оператор или любой другой оператор сравнения, который использует свободное сравнение, такое как !=
, <>
или же ==
, вы всегда должны смотреть на контекст чтобы увидеть, что, где и почему что-то преобразуется, чтобы понять, что происходит.
В качестве ссылки и примера вы можете увидеть таблицу сравнения в руководство:
Слабые сравнения с
==
┌─────────┬───────┬───────┬───────┬───────┬─────── ┬───────┬───────┬───────┬───────┬─────────┬─────── ┬───────┐ │ │ ИСТИНА │ ЛОЖЬ │ 1 │ 0 │ -1 │ «1» │ «0» │ «-1» │ NULL │ array () │ "php" │ "" │ ├─────────┼───────┼───────┼───────┼───────┼─────── ┼───────┼───────┼───────┼───────┼─────────┼─────── ┼───────┤ │ ИСТИНА │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ │ 1 │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ SE ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ 0 │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ИСТИНА │ │ -1 │ ИСТИНА, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ИСТИНА, ЛОЖЬ, ЛОЖЬ, ИСТИНА, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ. │ «1» │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ «0» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ -1 «-1» │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ NULL │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ TRUE │ TRUE │ array () │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ FALSE │ FALSE │ Ph «php» │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ "" │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ └─────────┴───────┴───────┴───────┴───────┴─────── ┴───────┴───────┴───────┴───────┴─────────┴─────── ┴───────┘
Если вы используете ===
оператор или любой другой оператор сравнения, который использует строгое сравнение, такое как !==
или же ===
, то вы всегда можете быть уверены, что типы не волшебно изменить, потому что не будет никакого преобразования. Таким образом, при строгом сравнении тип и значение должны совпадать, а не только значение.
В качестве ссылки и примера вы можете увидеть таблицу сравнения в руководство:
Строгое сравнение с
===
┌─────────┬───────┬───────┬───────┬───────┬─────── ┬───────┬───────┬───────┬───────┬─────────┬─────── ┬───────┐ │ │ ИСТИНА │ ЛОЖЬ │ 1 │ 0 │ -1 │ «1» │ «0» │ «-1» │ NULL │ array () │ "php" │ "" │ ├─────────┼───────┼───────┼───────┼───────┼─────── ┼───────┼───────┼───────┼───────┼─────────┼─────── ┼───────┤ │ ИСТИНА, ИСТИНА, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ, ЛОЖЬ. │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ 1 │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ 0 │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ -1 │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ «1» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ «0» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ -1 «-1» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ НУЛЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ array () │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE UE FALSE │ Ph «php» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ "" │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ └─────────┴───────┴───────┴───────┴───────┴─────── ┴───────┴───────┴───────┴───────┴─────────┴─────── ┴───────┘
Оператор == осуществляет приведение между двумя разными типами, если они различаются, а оператор === выполняет «безопасное сравнение типов». Это означает, что он вернет 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
Предупреждение: два экземпляра одного класса с эквивалентными членами НЕ соответствуют ===
оператор. Пример:
$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)
Одна картинка стоит тысячи слов:
==
диаграмма равенства:===
Диаграмма равенства:Исходный код для создания этих изображений:
https://github.com/sentientmachine/php_equality_charts
Те, кто хочет сохранить свое здравомыслие, читать дальше не будут.
Переменные PHP, которые еще не были объявлены, являются ложными.
False равно 0, пустой строке и пустому массиву и «0».
NAN не == сам, но это правда.
Новый класс == к 1.
Если вы используете PHP, вы не должны использовать оператор двойного равенства, всегда используйте тройное равенство.
Что касается 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');
}
Дополнение к другим ответам относительно сравнения объектов:
== сравнивает объекты, используя имя объекта и его значения. Если два объекта одного типа и имеют одинаковые значения элементов, $a == $b
дает истину.
=== сравнивает внутренний идентификатор объекта из объектов. Даже если члены равны, $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
Проще говоря:
== проверяет, если эквивалент (только значение)
=== проверяет, так же (значение && тип)
Эквивалент против того же: аналогия
1 + 1 = 2 + 0 (Эквивалент)
1 + 1 = 1 + 1 (так же)
В PHP:
правда == 1 (истина — эквивалент по значению)
правда === 1 (ложь — не одно и то же по значению && тип)
Это все о типах данных. Возьмите BOOL
(true или false), например:
true
также равно 1
а также
false
также равно 0
==
не заботится о типах данных при сравнении:
Так что, если у вас есть переменная, которая равна 1 (который также может быть true
):
$var=1;
А потом сравнить с ==
:
if ($var == true)
{
echo"var is true";
}
Но $var
на самом деле не равно true
, Является ли? Имеет значение int 1
вместо этого, что, в свою очередь, равно истинному.
С ===
типы данных проверяются, чтобы убедиться, что две переменные / объекты / что угодно используют один и тот же тип.
Так что если бы я сделал
if ($var === true)
{
echo "var is true";
}
это условие не будет выполнено, так как $var !== true
это только == true
(если вы понимаете, о чем я).
Зачем вам это нужно?
Просто — давайте посмотрим на одну из функций PHP: array_search()
:
array_search()
Функция просто ищет значение в массиве и возвращает ключ элемента, в котором было найдено значение. Если значение не может быть найдено в массиве, возвращается ложный. Но что, если вы сделали 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.
}
Итак, вы видите, как это может быть проблемой сейчас?
Большинство людей не используют == false
при проверке, возвращает ли функция ложь. Вместо этого они используют !
, Но на самом деле это точно так же, как использование ==false
так что если вы сделали:
$arr = array("name");
if (!array_search("name", $arr)) // This is the same as doing (array_search("name", $arr) == false)
Так что для таких вещей, вы бы использовали ===
вместо этого, чтобы проверить тип данных.
Одним из примеров является то, что атрибут базы данных может быть нулевым или «»:
$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