Los 3 iguales iguales

149

¿Cuál es la diferencia entre =, ==y ===?

Creo que usar un signo igual es declarar una variable, mientras que dos signos iguales son para una condición de comparación y, por último, tres signos iguales son para comparar valores de variables declaradas.

fresa
fuente
mira
1
Para usuarios avanzados de PHP, sabiendo la diferencia entre == y === y preguntándose a sí mismos "¿es más rápido comparar con == o con === cuando estoy seguro de que ambos operandos son del mismo tipo?" en mi script de referencia a continuación.
lucaferrario
@Strawberry Creo que la etiqueta de la pregunta también debe incluir la etiqueta de JavaScript, ya que también se aplica a ese idioma.
Funk Forty Niner
(Actualización): he agregado la etiqueta javascript en una edición, ya que ha habido bastantes preguntas sobre dónde la gente usaba =javascript. Eso no solo se aplica a PHP, sino también a otros lenguajes.
Funk Forty Niner
Seguí adelante y eliminado la etiqueta de JavaScript: todas las respuestas aquí son sólo alrededor de PHP (excepto la última, que es muy débil), no son las diferencias entre cómo los idiomas manejarlo, y ya existe de hecho una canónica pregunta JavaScript similares de ( lo que equivale operador (== vs ===) se debe utilizar en las comparaciones de JavaScript? ).
JJJ

Respuestas:

172

Tiene =el operador de asignación , ==el operador de comparación 'igual' y ===el operador de comparación 'idéntico' .

$a = $b     Assign      Sets $a to be equal to $b.
$a == $b    Equal       TRUE if $a is equal to $b.
$a === $b   Identical   TRUE if $a is equal to $b, and they are of the same type. (introduced in PHP 4)

Para obtener más información sobre la necesidad de ==y ===, y las situaciones de utilizar cada uno, vistazo a la documentación .

Gnarf
fuente
cuando comparo dos fechas y horas idénticas, tengo un resultado falso, ¿por qué? ejemplo: sandbox.onlinephpfunctions.com/code/…
stloc
3
@stloc, ===con objetos le dice si son el mismo objeto, no si tienen el mismo contenido.
Andrea
Introducido en PHP4, divertido en Y2018 ;-)
mvorisek
22
  • = es el operador de asignación
  • == es el operador de comparación (verifica si dos variables tienen valores iguales)
  • === es el operador de comparación idéntico (verifica si dos variables tienen valores iguales y son del mismo tipo).
Rich Adams
fuente
8

= operador de asignación

== comprueba si dos variables tienen el mismo valor

=== comprueba si dos variables tienen el mismo valor Y si sus tipos son iguales

Silvio Donnini
fuente
1
Conozca también las versiones! = Y! == 'not' de los dos operadores de comparación. Algunos idiomas usan: = como asignación, solo para evitar este tipo de confusión.
Phil Perry
3

El operador = asigna el valor a una variable $ seis = 6; el valor 6 se asigna a la variable $ seis

== operador verifica si el valor de ambas variables es igual y se usa principalmente en condiciones como declaraciones if

$a = 2;
$b = 2;
if ($a == $b) { 
    echo both variables have the same value; 
}

=== operador similar a == (verifique si el valor es igual) y también verifique si ambos son del mismo tipo de datos

$a = 2;
$b = "2";
if ($a === $b) {
    echo "both variable have same value and of same data type";
} else {
    echo 'both variable is either not equal or not of same data type';
}

// aquí $ a es de tipo int mientras que $ b es de tipo string. Así que aquí la salida

Gideon Babu
fuente
0

Para los usuarios avanzados de PHP, saber la diferencia entre ==y ===y preguntarse "¿es más rápido comparar con ==o ===cuando estoy seguro de que ambos operandos son del mismo tipo?"

La respuesta breve y general es: no hay aumento de rendimiento en el uso ===en estos casos, por lo que probablemente debería usar ==.

Para los interesados ​​en compararlo ellos mismos, pueden usar el siguiente código que escribí ad-hoc e intentar diferentes valores para $ay $b:

<?php
    // CONFIGURATION
    $cycles = 1000000;
    $a = 'random string 1';
    $b = 'random string 2';

    // FUNCTIONS
    function compare_two_equals($a, $b) {
        if ($a == $b) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    function compare_three_equals($a, $b) {
        if ($a === $b) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    // EXECUTION
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_two_equals($a, $b);
    }
    $time_two_a = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_three_equals($a, $b);
    }
    $time_three_a = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_two_equals($a, $b);
    }
    $time_two_b = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_three_equals($a, $b);
    }
    $time_three_b = microtime(TRUE) - $time;
    $time = microtime(TRUE);

    // RESULTS PRINTING
    print "<br />\nCOMPARE == (FIRST TRY): " . number_format($time_two_a, 3) . " seconds";
    print "<br />\nCOMPARE == (SECOND TRY): " . number_format($time_two_b, 3) . " seconds";
    print "<br />\nCOMPARE === (FIRST TRY): " . number_format($time_three_a, 3) . " seconds";
    print "<br />\nCOMPARE === (SECOND TRY): " . number_format($time_three_b, 3) . " seconds";
?>

NOTA: La comparación es válida solo cuando cada "PRIMERA PRUEBA" está muy cerca de su "SEGUNDA PRUEBA". Si son significativamente diferentes, significa que el procesador estaba ocupado haciendo otra cosa mientras ejecutaba las comparaciones y, por lo tanto, los resultados no son confiables y el punto de referencia debería ejecutarse nuevamente.

lucaferrario
fuente
9
Microbenchmarks como este no son muy confiables. También es muy poco probable que quiera preocuparse ==o ===ser la causa de su problema de rendimiento. OMI: Es mejor ser estricto ( ===) a menos que explícitamente quiera ser flojo ( ==) acerca de sus comparaciones. El número de casos extremos extraños, es decir, "5 is not a number" == 5puede conducir a errores extravagantes. ===Nunca sufre de este problema.
Gnarf
Mi prueba fue decirle a los programadores que si eligen ===por razones de rendimiento, están equivocados. Por lo tanto, los programadores son libres de elegir ===o se ==basan en razones lógicas pero no en razones de rendimiento: hay diferentes casos para preferir uno u otro y el rendimiento no debe tenerse en cuenta en absoluto.
lucaferrario