Felix Riesterer: gleich und selbst

Beitrag lesen

Lieber Kiffer,

je nach Programmiersprache ist das intern eventuell anders geregelt, aber betrachte das einmal vom Standpunkt der JavaScript-Engine aus. Dort ist grundsätzlich alles ein Objekt, bis auf gewisse "primitive" Werte, wozu wohl auch die Integer-Zahlen gehören. Zwar könnte Dir molily sicherlich genauer sagen, wie das intern funktioniert, aber meine Ausführungen, auch wenn sie vielleicht nicht immer ganz 100%ig sachlich richtig sind, sollten Dir weiterhelfen können.

In JavaScript definiere ich in einer Funktion zwei lokale Variablen x und y, welchen ich jeweils den Integer-Wert 1 zuweise:

function test () {  
    var x, y;  
  
    x = 1;  
    y = 1;  
  
    alert("x: "+x+" - y: "+y); // "x: 1 - y: 1"  
  
    // der erste Zweig wird immer genommen werden:  
    if (x === y) {  
        alert("x und y haben sowohl denselben Wert, als auch denselben Datentyp!");  
    } else {  
        alert("x und y haben vielleicht denselben Wert, nicht aber auch denselben Datentyp!");  
    }  
}

In JavaScript steht in der Variablen x ein Integer-Wert von 1 und in der Variablen y ebenso. Da Integer-Werte keine komplexen Objekte sind, lässt sich mit Sicherheit sagen, dass die eins in x nicht dieselbe eins wie in y ist, auch wenn der Datentyp und der Wert identisch sind. Daher kann man nur sagen "hat denselben Wert", nicht aber "ist das selbe".

Probieren wir das einmal mit einer leicht anderen Syntax:

var x = y = 1;

Auch hier entsteht dasselbe Ergebnis wie oben.

Man kann das in JS dadurch überprüfen, indem man den Wert in x verändert. Ist der Wert in y nach der Änderung in x noch immer derselbe, dann hatte y eine andere eins als x. Sollte sich in y der Wert allerdings mit verändert haben, dann hatte y tatsächlich dieselbe eins.

Die obigen Verhältnisse bleiben sogar erhalten, wenn man das Ganze so anfängt:

var x, y;  
  
x = y = new Number(1);  
x = new Number(2);  
  
alert(y); // "1"

Auch wenn man hier eine Instanz eines Number-Objektes bemüht hat, hantiert JavaScript intern nicht mit dem identischen Objekt bei x und y, sondern gibt x ein anderes Objekt als y, sodass die Änderung in x sich nicht auf y auswirkt.

In JS und PHP (als auch in anderen Programmiersprachen) ist es oft genug, wenn man auf einen gleichen Wert prüft. Dazu benutzt man den ==-Operator. Dieser prüft nur, ob man zwei Werte als "kommt auf's Gleiche raus" prüfen kann. Hier gilt also "hat den gleichen Wert".

Will man dagegen nicht nur auf "kommt auf's Gleiche raus", sondern auch auf den gleichen Datentyp prüfen, muss man den ===-Operator verwenden. In JS kann das bei komplexeren Objekten bedeuten, dass man von ein und demselben Objekt spricht (wenn die Änderung in der einen Variable sich auf die andere auch auswirkt), in PHP bedeutet es dagegen nur, dass sowohl Wert, als auch Datentyp identisch sind. Hier sagt man dann "hat denselben Wert".

Liebe Grüße,

Felix Riesterer.

--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)