Was ist der Unterschied zwischen ==
y ===
?
- Wie genau funktioniert die lockere
==
Vergleich funktionieren? - Wie genau funktioniert die strenge
===
Vergleich funktionieren?
Was wären einige nützliche Beispiele?
Was ist der Unterschied zwischen ==
y ===
?
==
Vergleich funktionieren?===
Vergleich funktionieren?Was wären einige nützliche Beispiele?
==
y ===
Der Unterschied zwischen der lockeren ==
Gleichheitsoperator und der strenge ===
identische Operator ist genau erklärt in der Handbuch :
Vergleichsoperatoren
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.
==
gleicher VergleichWenn Sie die ==
Operator oder jeder andere Vergleichsoperator, der einen losen Vergleich verwendet, wie z.B. !=
, <>
ou ==
müssen Sie immer auf die Kontext um zu sehen, was, wo und warum etwas umgewandelt wird, um zu verstehen, was vor sich geht.
Als Referenz und Beispiel können Sie die Vergleichstabelle in der Handbuch :
Lose Vergleiche mit
==
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
===
gleicher VergleichWenn Sie die ===
Operator oder jeder andere Vergleichsoperator, der einen strengen Vergleich verwendet, wie z. B. !==
ou ===
dann können Sie immer sicher sein, dass die Typen nicht magisch ändern, denn es wird keine Umwandlung stattfinden. Bei einem strengen Vergleich müssen also Typ und Wert gleich sein, nicht nur der Wert.
Als Referenz und Beispiel können Sie die Vergleichstabelle in der Handbuch :
Strenge Vergleiche mit
===
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
Vielleicht werden Zeichenketten, die wie Zahlen aussehen, vor dem Vergleich in Zahlen umgewandelt. Wenn das stimmt, dann macht 000 == 0000 Sinn.
Was mich immer verwundert ist, dass false == array() und false == 0, aber array() != 0, also false == array() !=/== 0? das kommt mir komisch vor.
Mit dem Operator == wird zwischen zwei verschiedenen Typen gecastet, wenn sie unterschiedlich sind, während der Operator === einen "typensicheren Vergleich" durchführt. Das bedeutet, dass er nur dann true zurückgibt, wenn beide Operanden denselben Typ und denselben Wert haben.
Beispiele:
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
Warnung : Zwei Instanzen derselben Klasse mit gleichwertigen Mitgliedern entsprechen NICHT dem ===
Betreiber. Beispiel:
$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)
Kleiner Tipp: === gibt nur true zurück, wenn beide Operanden den gleichen Typ haben. und die Werte sind gleich \=)
@gnud Das ist genau das, was er in dem Beispiel gezeigt hat. Wenn es nur um den Vergleich der Typen ginge, würde man es einfach "Typenvergleich" nennen, oder?
Nachdem ich PHP seit 8 Jahren benutze, war ich gestern das erste Mal in einer Situation, in der ich === hätte benutzen sollen
Ein Bild sagt mehr als tausend Worte:
==
Gleichheitsdiagramm:===
Gleichheitsdiagramm:Quellcode zur Erstellung dieser Bilder:
https://github.com/sentientmachine/php_equality_charts
Diejenigen, die ihren Verstand bewahren wollen, lesen nicht weiter, denn nichts davon wird einen Sinn ergeben, außer dass das Wahnsinnsfraktal von PHP so konzipiert wurde.
NAN != NAN
sondern NAN == true
.
==
wandelt den linken und den rechten Operanden in Zahlen um, wenn links eine Zahl ist. Also 123 == "123foo"
mais "123" != "123foo"
Eine hexadezimale Zeichenkette in Anführungszeichen ist gelegentlich ein Fließkomma und wird gegen Ihren Willen in ein Fließkomma umgewandelt, was einen Laufzeitfehler verursacht.
==
ist nicht transitiv, weil "0"== 0
そして 0 == ""
sondern "0" != ""
PHP-Variablen, die noch nicht deklariert wurden, sind falsch, obwohl PHP eine Möglichkeit hat, undefinierte Variablen darzustellen, wird diese Funktion mit ==
.
"6" == " 6"
, "4.2" == "4.20"
そして "133" == "0133"
sondern 133 != 0133
. Aber "0x10" == "16"
y "1e3" == "1000"
dass die überraschende Konvertierung von Zeichenketten in oktale Werte sowohl ohne Ihre Anweisung als auch ohne Ihre Zustimmung erfolgt und einen Laufzeitfehler verursacht.
False == 0
, ""
, []
y "0"
.
Wenn Sie 1 zu einer Zahl addieren und diese bereits ihren Maximalwert hat, wird sie nicht umgeschlagen, sondern in infinity
.
Eine neue Klasse ist == bis 1.
False ist der gefährlichste Wert, weil False für die meisten anderen Variablen == ist, was den Zweck der Variablen weitgehend zunichte macht.
Wenn Sie PHP verwenden, sollten Sie den Operator double equals nicht verwenden, denn wenn Sie triple equals verwenden, sind die einzigen Randfälle, über die Sie sich Sorgen machen müssen, NAN und Zahlen, die so nahe am Maximalwert ihres Datentyps liegen, dass sie ins Unendliche geworfen werden. Mit double equals kann alles eine Überraschung sein ==
zu irgendetwas oder, oder kann überraschend gegen Ihren Willen gecastet werden und !=
zu etwas, dem es offensichtlich gleich sein sollte.
Überall, wo Sie ==
in PHP ist ein schlechter Codegeruch wegen der 85 Fehler, die durch implizite Casting-Regeln aufgedeckt werden, die anscheinend von Millionen von Programmierern entwickelt wurden, die nach dem Prinzip der Brownschen Bewegung programmieren.
Ist es wirklich eine gute (und sichere) Idee, immer dreifache Gleichheitszeichen zu verwenden?
In Bezug auf JavaScript:
Der ===-Operator funktioniert genauso wie der ==-Operator, erfordert aber, dass seine Operanden nicht nur denselben Wert, sondern auch denselben Datentyp haben.
Das folgende Beispiel zeigt zum Beispiel "x und y sind gleich", aber nicht "x und y sind identisch".
var x = 4;
var y = '4';
if (x == y) {
alert('x and y are equal');
}
if (x === y) {
alert('x and y are identical');
}
Ich habe diese Antwort mit einem DV versehen, weil sie 30 Minuten nach der Selbstantwort des Auftraggebers kam, die dieselbe Einsicht in Bezug auf lose getippte Vergleiche enthielt. Diese Javascript-Antwort auf eine ursprünglich und derzeit mit php getaggte Frage sollte wirklich entfernt werden, aber dazu muss die Zahl der Stimmen durch die Bemühungen der Gemeinschaft sinken. Mit anderen Worten: Es sind noch viele weitere DVs nötig, damit eine angemessene Kuratierung stattfindet und die Antwort des (gelöschten) Benutzers entfernt wird.
Eine Ergänzung zu den anderen Antworten zum Objektvergleich:
\== vergleicht Objekte anhand des Namens des Objekts und seiner Werte. Wenn zwei Objekte vom gleichen Typ sind und die gleichen Mitgliedswerte haben, $a == $b
ergibt wahr.
\=== Vergleicht die interne Objekt-ID der Objekte. Auch wenn die Mitglieder gleich sind, $a !== $b
wenn es sich nicht um genau dasselbe Objekt handelt.
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
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
@BenAubin Ernsthaft, die von Ihnen vorgenommenen Änderungen haben überhaupt nichts verbessert.
0 Stimmen
@BenAubin Ich verstehe, dass Sie helfen wollen, und das ist auch gut so, aber diese Bearbeitungen haben die Sache nicht wirklich verbessert. Und jetzt, wo du so viele Vertreter hast, werden deine Bearbeitungen nicht mehr in die Review-Warteschlange aufgenommen, also sei vorsichtig mit deinen Bearbeitungen.
0 Stimmen
@klutt Meine Änderungen waren beabsichtigt. Der Auftraggeber hat innerhalb weniger Minuten nach dem ursprünglichen Beitrag eine Änderung vorgenommen, in der er sowohl nach Javascript als auch nach PHP fragte, so dass sich viele der Antworten auf beide Sprachen beziehen. Wie ich in den Bearbeitungshinweisen erwähnt habe, haben meine Bearbeitungen diesen ursprünglichen Kontext wiederhergestellt.