String / Datentypen Praxisfrage

Hallo.

ich versthe folgendes Code „Snippet“ nicht:

var osp_URL= document.URL;
typeof(osp_URL)== „string“ ? osp_URL : document.URL;

dies hab ich aus einem tracker-script eines großen webcounter anbieters.

welchen sinn macht hier diese oder unterscheidung zwischen der variablen osp_URL und der direkten Funktion document.URL ?

das erste was ich da nicht verstehe, ist der zurückgelieferte wert bei der variableninitialisierung am anfang nicht immer ein string? (sprich der rückabewert der document.URL funktion immer ein string?)

ok, angenommen da kommt ein absolut neuer datentyp raus, dann macht die folgende oderunterscheidung doch auch keinen sinn (so wie sie programmiert ist), weil sie genau das selbe ergenis liefert.

oder etwa doch nicht?

vielleicht hat von euch ja jemand einen guten tip.
vielen dank
thomas

> var osp\_URL= document.URL;  
> typeof(osp\_URL)== "string" ? osp\_URL : document.URL;

ok, angenommen da kommt ein absolut neuer datentyp raus, dann
macht die folgende oderunterscheidung doch auch keinen sinn
(so wie sie programmiert ist), weil sie genau das selbe
ergenis liefert.

naja, mir sind jetzt schon an manchen stellen sachen aufgefallen, wo beim auslesen von solchen eingebauten werten nicht wirklich strings rauskommen.
hier z.b.:
mj = jetzt.getFullYear();
gibt einen string, aber ein anschliessendes:
mj = mj.replace(/^[0-9]{2}/,’’)
gibt nen fehler.

hingegen:
mj = new String(jetzt.getFullYear());
mj = mj.replace(/^[0-9]{2}/,’’)
laeuft durch.

war mir aber auch nur im mozilla aufgefallen.
an der stelle haette dein code irgendeinen sinn gemacht, weil er ueberprueft haette, ob ein korrekter string zugewiesen wurde. wenn … ja wenn in der zweiten zeile der wert einer variablen zugewiesen wuerde, oder vor dem typeof ein return stuende. oder ist der code aus einer funktion, und die zeile steht am ende und macht automatisch einen return?

hallo dog.je

erstmal vielen dank für dein posting!

dass deartige ausdrücke wirklich zu nicht-string-datentypen „evaluieren“ können ist mir neu. ist ja interessant zu hören.

ja wenn in der zweiten zeile der wert einer
variablen zugewiesen wuerde, oder vor dem typeof ein return
stuende. oder ist der code aus einer funktion, und die zeile
steht am ende und macht automatisch einen return?

jetzt nochmals zur zweiten zeile. ich hab wohl etwas zu viel von code entfernt, jedoch muss ich gestehen, dass ich deine antwort selbst dann nicht so ganz richtig verstehen kann. jetzt erstnochmal ein mehr oder weniger vollständiger code:

function Tracking()
{
var CONTENTSECTION= „“;
var CUSTOMDATA= „“;
var osp_URL= document.URL

function A(S, K)
{
U+="&"+S+"="+escape(K);
}

var U=„http“+(document.URL.indexOf(‚https:‘)==0?‚s‘:’’)+"://stat.onestat.com/asp/stat.asp?tagver=1&sid=xxxxxxxxx";

A( „url“,typeof(osp_URL)== „string“ ? osp_URL : document.URL);

A( „rf“, parent==self ? window.document.referrer : top.document.referrer);

A( „ul“, navigator.appName==„Netscape“ ? navigator.language : navigator.userLanguage);

A( „section“, typeof(CONTENTSECTION)== „string“ ? CONTENTSECTION : „“);

A( „custom“, typeof(CUSTOMDATA)== „string“ ? CUSTOMDATA : „“);

}

letztendlich findet hier ja doch eine variablenzuweisung statt. welchen einfluss hat die aber.

szenario 1:
es handelt sich wirklich um einen string: dann wird bei der dem exklusiven-oder der erste „ausdruck genommen“ sprich osp_URL und an die funktion zurückgeliefert, bzw der entsprechenden variable zugewieesn. nach dem es eh ein string ist, ist alles ok.

szenario2:
es handelt sich um einen unbekannten datentyp „xyunbekannt“: bei dem exklusiven oder wird auf den zweiten ausdruck „verzweigt“. der liefert doch dann allerdings exakt genau das _selbe_ ergebnis. sprich diesesn unbekannten datentypen und weist den der Funktion bzw. variable zu.
müsste dann nicht z.b. gerade bei dem zweiten ausdruck sowas stehen wie du das schon geschrieben hast. z.b.
new String(document.URL); sprich sicherstellen dass es eben ein string ist. sonst wird doch gerade der unbekannte datentyp zurückgeliefert und somit ist auch von der logik diese typeof abfrage gänzlich unnötig, weil als ergebnis so oder so entweder string oder der unbekannte datentyp rauskommen können.

(auch wird eine derartige abfrage nicht konsequent eingesetzt. bei windows.document.referrer (und den anderen) müsste dann ja ebenfalls eine derartige string-überprüfung stattfinden).

ehrlich gesagt, ich verstehe das mit den CONTENTDATA und CUSTOMSECTION auch nicht. stellen derartige abfragen nicht die ganze scriptsrache in frage. die werden mit einem leerstring initialisiert. das ganze auch gleich noch zwei mal. was soll denn in so einer variable drinstehen können wenn sie initialisiert wird. und welcher unterschied soll dann auch zusätzlich noch zwei variablen liefern.

vielen dank
thomas

jetzt nochmals zur zweiten zeile. ich hab wohl etwas zu viel
von code entfernt, jedoch muss ich gestehen, dass ich deine
antwort selbst dann nicht so ganz richtig verstehen kann.

ok, also das ergebnis der pruefung wird zum escape und concat an a uebergeben…
er uebergibt also entweder document.ulr, oder einen zugewiesenen string an die funktion…

ich habe mal nen dummy gebaut:

foo = "";
foo += escape(document.URL)+"\n";

var osp\_URL= document.URL 
foo += escape(osp\_URL);

alert(foo);

wenn also ein unterschied bestuende, dureften die beiden zeilen im alert nicht gleich sein, oder derbrowser muesste einen fehler werfen. zumindest auf meinen browsern hier sind sie es aber gleich.

weisst du was? wenn du es nicht unbedingt musst, solltest du den code nicht weiter analysieren, schau mal z.b. was mit CONTENTSECTION gemacht wird. es wird auf nullstring initialisert, nie wieder angefasst, es ist lokal, kann also von aussen auch nciht veraendert werden - und dann wieder die pruefung… ziemlich fuer umsonst, oder? das wuerde nur sinn machen, wenn die 3 ersten variablen zum setup irgendwie dazugehoeren, und pro einsatz geaendert werden, und eben u.U. auch mal einen nicht string enthalten koennen, wie z.b. eine objektreferenz oder so, aber dann weiss ich auch nciht was sinvolles aus escape(eineobjetreferenz) rauskommen soll…

Vielen Dank !
Hallo Dog.je,

danke für deine Antworten!

viele Grüße
tom