В чем разница между ==
и ===
?
- Как именно работает свободное
==
сравнение? - Как именно работает строгое
===
сравнение?
Какие были бы полезные примеры?
В чем разница между ==
и ===
?
==
сравнение?===
сравнение?Какие были бы полезные примеры?
==
и===
Разница между ==
оператором со слабым равенством и оператором со строгим ===
идентичным идентификатором в точности объяснена в руководстве :
Операторы сравнения
┌──────────┬───────────┬────────────────────────── ─────────────────────────────────┐ │ Пример │ Имя │ Результат │ ├──────────┼───────────┼────────────────────────── ─────────────────────────────────┤ A $ a == $ b │ Равен │ ИСТИНА, если $ a равно жонглированию типов. │ A $ a === $ b │ Одинаково │ ИСТИНА, если $ a равно $ b и они одного типа. │ └──────────┴───────────┴────────────────────────── ─────────────────────────────────┘
==
равное сравнениеЕсли вы используете ==
оператор или любой другой оператор сравнения, который использует слабое сравнение, например !=
, <>
или ==
, вам всегда нужно смотреть на контекст, чтобы увидеть, что, где и почему что-то преобразуется, чтобы понять, что происходит.
В качестве ссылки и примера вы можете увидеть таблицу сравнения в руководстве :
Слабые сравнения с
==
┌─────────┬───────┬───────┬───────┬───────┬─────── ┬───────┬───────┬───────┬───────┬─────────┬─────── ┬───────┐ │ │ TRUE │ FALSE │ 1 │ 0 │ -1 │ "1" │ "0" │ "-1" │ NULL │ array () │ "php" │ "" │ ├─────────┼───────┼───────┼───────┼───────┼─────── ┼───────┼───────┼───────┼───────┼─────────┼─────── ┼───────┤ │ ИСТИНА │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ │ 1 │ ИСТИНА │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ 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» │ ИСТИНА │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ "" │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ └─────────┴───────┴───────┴───────┴───────┴─────── ┴───────┴───────┴───────┴───────┴─────────┴─────── ┴───────┘
===
одинаковое сравнениеЕсли вы используете ===
оператор или любой другой оператор сравнения, который использует строгое сравнение, такое как !==
или ===
, то вы всегда можете быть уверены, что типы не будут волшебным образом изменяться, потому что преобразование не будет происходить. Таким образом, при строгом сравнении тип и значение должны совпадать, а не только значение.
В качестве ссылки и примера вы можете увидеть таблицу сравнения в руководстве :
Строгое сравнение с
===
┌─────────┬───────┬───────┬───────┬───────┬─────── ┬───────┬───────┬───────┬───────┬─────────┬─────── ┬───────┐ │ │ TRUE │ FALSE │ 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 │ FALSE │ Ph «php» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ │ «» │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ЛОЖЬ │ ИСТИНА │ └─────────┴───────┴───────┴───────┴───────┴─────── ┴───────┴───────┴───────┴───────┴─────────┴─────── ┴───────┘
true
илиfalse
. Это легко разыграть. Все остальные значения имеют, для всех практических целей, практически неограниченные комбинации. Есть"five" == 5
?array(0) == 0
?array(0,0,0) == 0
?0.0000000000000000000000000000000000000000000000000001 == array()
?false
для разных массивов в javascript, ноtrue
для PHP, пока их значения равны ."000" != "00"
,"000" == null
,"000" == false
,"0x0" == false
,array() == 0
,false != null
,array() != null
,false == "0x0"
,false == "000"
. В PHP это противоположное поведение:"000" == "00"
,"000" != null
,"000" != false
,"0x0" != false
,array() != 0
,false == null
,array() == null
,false != "0x0"
,false != "000"
.Оператор == осуществляет приведение между двумя различными типами, если они различаются, а оператор === выполняет «безопасное сравнение типов». Это означает, что он вернет true, только если оба операнда имеют одинаковый тип и одно и то же значение.
Примеры:
Предупреждение : два экземпляра одного класса с эквивалентными членами НЕ соответствуют
===
оператору. Пример:источник
Одна картинка стоит тысячи слов:
==
График равенства PHP Double Equals :===
Диаграмма равенства тройных равных PHP :Исходный код для создания этих изображений:
https://github.com/sentientmachine/php_equality_charts
Медитация Гуру
Те, кто хочет сохранить свое здравомыслие, не читают дальше, потому что ничего из этого не имеет никакого смысла, кроме как сказать, что именно так был разработан фрактал безумия в PHP.
NAN != NAN
ноNAN == true
.==
преобразует левый и правый операнды в числа, если левый номер. Так123 == "123foo"
, но"123" != "123foo"
Шестнадцатеричная строка в кавычках иногда является плавающей точкой и будет неожиданно брошена против вашей воли, вызывая ошибку во время выполнения.
==
не является переходным, потому что"0"== 0
,0 == ""
но"0" != ""
==
."6" == " 6"
,"4.2" == "4.20"
и"133" == "0133"
но133 != 0133
. Но"0x10" == "16"
и предоставление"1e3" == "1000"
этого неожиданного преобразования строки в восьмеричное произойдет как без вашего разрешения, так и с согласия, что приведет к ошибке во время выполнения.False == 0
,""
,[]
И"0"
.Когда числа достаточно велики, они == Бесконечность.
Новый класс == к 1.
Надежда:
Если вы используете PHP, вы не должны использовать оператор двойного равенства, потому что если вы используете тройное равенство, единственные крайние случаи, о которых нужно беспокоиться, это NAN и числа настолько близкие к бесконечности, что они приводятся к бесконечности. При двойном равенстве все может быть неожиданностью
==
для чего-либо или, или может быть удивлением, брошенным против вашей воли и!=
чему-то, чему оно явно должно быть равноВезде, где вы используете
==
PHP, дурно пахнет код из-за 85 ошибок в нем, обнаруживаемых неявными правилами приведения, которые, похоже, разработаны миллионами программистов, программирующих с помощью броуновского движения.источник
Что касается JavaScript:
Оператор === работает так же, как оператор ==, но требует, чтобы его операнды имели не только одинаковое значение, но и одинаковый тип данных.
Например, в приведенном ниже примере будет отображаться «x и y равны», но не «x и y идентичны».
источник
Дополнение к другим ответам относительно сравнения объектов:
== сравнивает объекты, используя имя объекта и его значения. Если два объекта имеют одинаковый тип и имеют одинаковые значения членов,
$a == $b
выдается значение true.=== сравнивает внутренний идентификатор объекта из объектов. Даже если члены равны,
$a !== $b
если они не совсем один и тот же объект.источник
Проще говоря:
== проверяет эквивалентность (только значение)
=== проверяет, совпадает ли (значение && type)
эквивалентно или одинаково: аналогия
1 + 1 = 2 + 0 (эквивалент)
1 + 1 = 1 + 1 (то же самое)
В PHP:
true == 1 (true - эквивалент по значению)
true === 1 (false - не совпадает по значению && type)
источник
Это все о типах данных. Возьмите
BOOL
(истина или ложь), например:true
также равно,1
аfalse
также равно0
The
==
не заботится о типах данных при сравнении: так что если у вас есть переменная, равная 1 (которая также может бытьtrue
):$var=1;
А затем сравните с
==
:Но на
$var
самом деле не равноtrue
, не так ли?1
Вместо этого он имеет значение int , которое, в свою очередь, равно true.С
===
помощью проверяются типы данных, чтобы убедиться, что две переменные / объекты / что угодно используют один и тот же тип.Так что если бы я сделал
это условие не будет истинным, как
$var !== true
только== true
(если вы знаете, что я имею в виду).Зачем вам это нужно?
Просто - давайте посмотрим на одну из функций PHP
array_search()
:array_search()
Функция просто ищет значения в массиве и возвращает ключ элемента значение было найдено. Если значение не может быть найден в массиве, он возвращает ложь . Но что делать , если вы сделали значениеarray_search()
on, хранящееся в первом элементе массива (который будет иметь ключ массива0
) ...array_search()
функция вернула бы 0 ..., что равно false ..Так что, если вы сделали:
Итак, вы видите, как это может быть проблемой сейчас?
Большинство людей не используют
== false
при проверке, возвращает ли функция false. Вместо этого они используют!
. Но на самом деле, это точно так же, как использование==false
, так что если вы сделали:Таким образом, для таких вещей вы должны использовать
===
вместо этого, чтобы проверить тип данных.источник
Одним из примеров является то, что атрибут базы данных может быть нулевым или "":
источник
php == - это оператор сравнения, который сравнивает значения переменных. Но === сравнивает значение и тип данных.
Например,
В этом случае вывод будет «Переменные равны», даже если их типы данных различны.
Но если мы будем использовать === вместо ==, результатом будет «Переменные не равны». Сначала php сравнивает значение переменной, а затем тип данных. Здесь значения одинаковы, но типы данных разные.
источник
Данный
x = 5
1) Оператор: == "равно".
x == 8
ложно2) Оператор: === "точно равно" (значение и тип)
x === 5
верно,x === "5"
ложноисточник
Будьте осторожны, хотя. Здесь пресловутая проблема.
против
источник
Короче говоря, === работает так же, как == в большинстве других языков программирования.
PHP позволяет проводить сравнения, которые на самом деле не имеют смысла. Пример:
Хотя это допускает некоторые интересные «горячие клавиши», вам следует остерегаться, поскольку функция, которая возвращает то, что не должна (например, «ошибка» вместо числа), не будет поймана, и вам будет интересно, что же произошло.
В PHP == сравнивает значения и при необходимости выполняет преобразование типа (например, строка «12343sdfjskfjds» станет «12343» в целочисленном сравнении). === будет сравнивать значение И тип и вернет false, если тип не совпадает.
Если вы заглянете в руководство по PHP, то увидите, что многие функции возвращают «ложь» в случае сбоя функции, но они могут вернуть 0 в успешном сценарии, поэтому они рекомендуют делать «if (function ()! ==» ложно) "чтобы избежать ошибок.
источник
Немного примеров
PS
против
источник
Вы должны использовать ===, чтобы проверить, является ли функция или переменная ложной, а не просто равной ложной (ноль или пустая строка).
В этом случае strpos вернет 0, что будет равно ложному в тесте
или
это не то, что вы хотите здесь.
источник
Что касается того, когда использовать один над другим, возьмем, например,
fwrite()
функцию в PHP.Эта функция записывает содержимое в файловый поток. Согласно PHP, «
fwrite()
возвращает количество записанных байтов или FALSE при ошибке». Если вы хотите проверить, был ли вызов функции успешным, этот метод имеет недостатки:Он может вернуть ноль (и считается успешным), и ваше состояние все еще срабатывает. Правильный путь будет:
источник
PHP является свободно типизированным языком. Использование оператора двойного равенства позволяет свободно проверять переменную.
Слабая проверка значения позволит некоторым подобным, но не равным, значениям равняться одному и тому же:
Все эти значения будут равны как равные, используя оператор двойного равенства.
источник
Переменные имеют тип и значение.
Когда вы используете эти переменные (в PHP), иногда у вас нет хорошего типа. Например, если вы делаете
PHP должен конвертировать ("для приведения") $ var в целое число. В этом случае «$ var == 1» имеет значение true, потому что любая непустая строка приводится к 1.
При использовании === вы проверяете, что значение И ТИП равны, поэтому "$ var === 1" равно false.
Это полезно, например, когда у вас есть функция, которая может возвращать false (при ошибке) и 0 (результат):
Этот код неверен, как будто
myFunction()
возвращает 0, он приведен к ложному, и вы, кажется, есть ошибка. Правильный код:потому что тест состоит в том, что возвращаемое значение «является логическим значением и является ложным», а не «может быть приведено к ложному».
источник
Предполагается, что
===
оператор сравнивает точное равенство содержимого, а==
оператор сравнивает семантическое равенство. В частности, он будет приводить строки к числам.Равенство - обширный предмет. Смотрите статью в Википедии о равенстве .
источник
источник
Все ответы до сих пор игнорируют опасную проблему с ===. Попутно было отмечено, но не подчеркнуто, что integer и double - это разные типы, поэтому следующий код:
дает:
Обратите внимание, что это НЕ случай «ошибки округления». Два числа в точности равны последнему биту, но имеют разные типы.
Это неприятная проблема, потому что программа, использующая ===, может успешно работать годами, если все числа достаточно малы (где «достаточно мало» зависит от оборудования и ОС, на которой вы работаете). Однако если случайно целое число оказывается достаточно большим, чтобы его можно было преобразовать в двойное, его тип изменяется «навсегда», даже если последующая операция или множество операций может вернуть его к небольшому целому значению. И это становится хуже. Он может распространяться - инфекция двойственности может передаваться всем, к чему она касается, по одному расчету за раз.
В реальном мире это, вероятно, будет проблемой в программах, которые обрабатывают даты после 2038 года, например. В настоящее время метки времени UNIX (количество секунд с 1970-01-01 00:00:00 UTC) потребуют более 32 бит, поэтому их представление «волшебным образом» переключится на удвоение в некоторых системах. Поэтому, если вы вычислите разницу между двумя значениями, у вас может получиться пара секунд, но в виде двойного числа, а не целочисленного результата, полученного в 2017 году.
Я думаю, что это намного хуже, чем преобразования между строками и числами, потому что это неуловимо. Мне легко отслеживать, что такое строка и что такое число, но отслеживать количество бит в числе мне не по силам.
Итак, в приведенных выше ответах есть несколько хороших таблиц, но нет различия между 1 (как целое число) и 1 (тонкое двойное число) и 1.0 (очевидное двойное число). Кроме того, совет, что вы всегда должны использовать === и никогда не ==, не очень хорош, потому что === иногда терпит неудачу, когда == работает должным образом. Кроме того, JavaScript не эквивалентен в этом отношении, потому что он имеет только один тип чисел (внутренне он может иметь разные побитовые представления, но это не вызывает проблем для ===).
Мой совет - не используйте ни один. Вам нужно написать свою собственную функцию сравнения, чтобы действительно исправить этот беспорядок.
источник
Есть два различия между
==
и===
в PHP массивы и объекты , которые я думаю , не говоря уже здесь; два массива с разными типами ключей и объектов.Два массива с разными типами ключей
Если у вас есть массив с сортировкой ключей и другой массив с другой сортировкой ключей, они строго различаются (т.е. используют
===
). Это может произойти, если вы отсортируете ключ по массиву и попытаетесь сравнить отсортированный массив с исходным.Например, рассмотрим пустой массив. Сначала мы пытаемся добавить некоторые новые индексы в массив без какой-либо специальной сортировки. Хорошим примером будет массив со строками в качестве ключей. Теперь углубимся в пример:
Теперь у нас есть массив несортированных ключей (например, «он» пришел после «вы»). Рассмотрим тот же массив, но мы отсортировали его ключи по алфавиту:
Совет : Вы можете отсортировать массив по ключу, используя ksort () .
Теперь у вас есть другой массив с сортировкой ключей, отличной от первой. Итак, мы собираемся сравнить их:
Примечание : это может быть очевидно, но сравнение двух разных массивов с использованием строгого сравнения всегда приводит к результатам
false
. Тем не менее, два произвольных массива могут быть равны, используя===
или нет.Вы скажете: «Эта разница незначительна». Тогда я говорю, что это различие и должно быть рассмотрено и может произойти в любое время. Как уже упоминалось выше, сортировка ключей в массиве является хорошим примером этого.
Объекты
Имейте в виду, два разных объекта никогда не бывают строго одинаковыми . Эти примеры помогут:
Примечание . Присвоение объекта другой переменной не создает копию, а создает ссылку на ту же область памяти, что и объект. Посмотреть здесь .
Примечание . Начиная с PHP7, добавлены анонимные классы . Из результатов нет никакой разницы между
new class {}
иnew stdClass()
в тестах выше.источник