Standardwert für Funktionsvariable?
Bill
- javascript
Moinsen,
in PHP zb. kann man einer Funktionsvariable direkt einen Defaultwert geben, nur wie geht das bei Javascript?
Schreibe ich function foo (bar = 1) {...} wird die Funktion nicht aufgerufen.
Moin Moin,
in PHP zb. kann man einer Funktionsvariable direkt einen Defaultwert geben, nur wie geht das bei Javascript?
Schreibe ich function foo (bar = 1) {...} wird die Funktion nicht aufgerufen.
Durch Definition der Funktion
function foo()
{
var v=1;
}
Durch Übergabe:
function foo(v)
{
}
foo(1);
Gruß aus Berlin!
eddi
Ja schon klar, nur möchte ich die Funktion zb. ohne Variablenübergabe aufrufen. Geht das dann einfach? Meckert JS da nicht?
Hallo Bill,
var merke_dir='habe mir alles gemerkt'
function hast_du_gemerkt()
{
alert(merke_dir);
}
hast_du_gemerkt();
Gruß aus Berlin!
eddi
Oh, JS lässt aber einiges zu. Ich beschäftige mich einfach zu wenig damit. Danke.
Hi,
Ja schon klar, nur möchte ich die Funktion zb. ohne Variablenübergabe aufrufen. Geht das dann einfach? Meckert JS da nicht?
Nein, die Variable ist dann einfach undefiniert.
Und du kannst sogar mehr Werte übergeben, als du Variablen definert hast! Die "überzähligen" Werte sind dann halt über ein Array abrufbar, in dem alle übergebenen Werte enthalten sind (Funktionsname.arguments[], und die Anzahl der Werte stehen natürlich in Funktionsname.arguments.length).
Gruß, Cybaer
Hi,
Ja schon klar, nur möchte ich die Funktion zb. ohne Variablenübergabe aufrufen. Geht das dann einfach? Meckert JS da nicht?
Nein, die Variable ist dann einfach undefiniert.
Nein, die Variable, sofern sie kein Ojekt ist, kann auch innerhalb von Funktionen genutzt werden.
Gruß aus Berlin!
eddi
in PHP zb. kann man einer Funktionsvariable direkt einen Defaultwert geben, nur wie geht das bei Javascript?
Schreibe ich function foo (bar = 1) {...} wird die Funktion nicht aufgerufen.
Das geht nichzt direkt, aber so kannst du es simulieren:
function test(x)
{
if(typeof x == 'undefined') x = 'default';
}
Struppi.
Hi,
if(typeof x == 'undefined') x = 'default';
Wirklich mit dem _String_ 'undefined' vergleichen? Ist undefined nicht ein Keyword?
cu,
Andreas
if(typeof x == 'undefined') x = 'default';
Wirklich mit dem _String_ 'undefined' vergleichen? Ist undefined nicht ein Keyword?
Ja - mit dem String vergleichen.
Nein - undefined ist kein Keyword.
Struppi.
Hallo,
if(typeof x == 'undefined') x = 'default';
Wirklich mit dem _String_ 'undefined' vergleichen? Ist undefined nicht ein Keyword?
undefined ist eine Eigenschaft (also ein Unterobjekt) des »globalen« Objekts, so wie NaN und Infinity, bekannter als »objektunabhängige« Eigenschaften. undefined hat den Typ Undefined und somit den Wert undefined. x==undefined ist also möglich (wenn es der Browser denn versteht). Das funktioniert aber nur, wenn x eine zuvor deklarierte Variable (var x;) ist, also existiert, aber noch keinen bestimmten Typ und Wert erhalten hat. Das Nennen von x in der Parameterliste einer Funktion kommt var x; gleich, insofern wäre x==undefined in diesem Kontext möglich, aber nicht so zuverlässig wie typeof.
Mathias
Hi,
if(typeof x == 'undefined') x = 'default';
Wirklich mit dem _String_ 'undefined' vergleichen? Ist undefined nicht ein Keyword?
undefined ist eine Eigenschaft (also ein Unterobjekt) des »globalen« Objekts, so wie NaN und Infinity, bekannter als »objektunabhängige« Eigenschaften. undefined hat den Typ Undefined und somit den Wert undefined. x==undefined ist also möglich (wenn es der Browser denn versteht). Das funktioniert aber nur, wenn x eine zuvor deklarierte Variable (var x;) ist, also existiert, aber noch keinen bestimmten Typ und Wert erhalten hat. Das Nennen von x in der Parameterliste einer Funktion kommt var x; gleich, insofern wäre x==undefined in diesem Kontext möglich, aber nicht so zuverlässig wie typeof.
Ok, danke (auch an Struppi), alle Klarheiten beseitigt ;-)
(ich versuche ja immer, javascript zu vermeiden, daher ist mein Wissen in diesem Bereich nicht allzu gut - ich hatte mich erinnert, irgendwo "undefined" als Keywort gesehen zu haben, aber die Details nicht gespeichert)
cu,
Andreas
Hi,
function test(x)
{
if(typeof x == 'undefined') x = 'default';
}
Unnötig kompliziert und fehleranfällig (typeof existiert erst ab Version 1.1). In allen JS-Versionen funktioniert dies:
function test(x) {
x=(x)?x:"default";
}
Gruß, Cybaer
function test(x)
{
if(typeof x == 'undefined') x = 'default';
}Unnötig kompliziert und fehleranfällig (typeof existiert erst ab Version 1.1). In allen JS-Versionen funktioniert dies:
d,h, welche browser können das nicht?
Netscape 3 und IE 3 kennen es.
function test(x) {
x=(x)?x:"default";
}
Nur leider ist das falsch.
alert( test(0) )
so kannst du x nicht mehr den wert null geben.
Struppi.
Hi,
d,h, welche browser können das nicht?
Browser mit JavaScript 1.0. Welches das außer Netscape 2 und der erste IE 3 sind, weiß ich nicht (es gibt so viele Browser ;-)). Und ich hätte mir z.B. auch nicht vorstellen können, daß noch im Jahr 2003 neue Browser mit z.B. JavaScript 1.3 (oder war es 1.2?) erscheinen - man kann halt nie wissen - so ganz ohne Glasgoogle. :)
Netscape 3 und IE 3 kennen es.
Der Netscape 3 hat ja auch JavaScript 1.1. Bei IE kommt es hingegen auf die Unterversion des IE 3 an.
so kannst du x nicht mehr den wert null geben.
JESUS! Sei doch nicht so "unkreativ". =;-)
Wenn Du das möchtest, frag halt noch zusätzlich auf 0 ab ("|| x==0"). =:-o
Gruß, Cybaer
PS: Tip: typeof ist natürlic problemlos in *externen* JavaScripts zu verwenden, da JS 1.0 diese ja nicht lädt. 8-)
PPS: Wenn schon "sauber" programmieren, dann aber richtig (und kein "bißchen sauber reicht"). ;-))
so kannst du x nicht mehr den wert null geben.
JESUS! Sei doch nicht so "unkreativ". =;-)
Nenn mich struppi ;-)
Es geht nicht um unkreativ, der Frager wollte Wissen, wie man default Werte mit JS anlegt.
Wenn Du das möchtest, frag halt noch zusätzlich auf 0 ab ("|| x==0"). =:-o
Und wie sieht es bei einem Leerstring aus?
Die sauberste Methode ist den Parameter mit typeof abfragen, da das genau das ist was der Frager Wissen wollte. Deine Lösung ist die Antwort auf die Frage, wie kann ich einen Wert vorbelegen, wenn der Parameter unwahr ist.
PPS: Wenn schon "sauber" programmieren, dann aber richtig (und kein "bißchen sauber reicht"). ;-))
so sieht's aus. Mit deiner Variante hatte ich schon desöfteren Probleme, da ich meistens setter und getter Funktionen in einer nutze und ein Leerstring oder null fast immer gültige Werte für Parameter sind.
Struppi.
Hi,
JESUS! Sei doch nicht so "unkreativ". =;-)
Nenn mich struppi ;-)
Mist! Dann kann ich ja Kreuz und Nägel wieder einpacken.<img src="http://www.vampirehost.de/pzn/texte/img/crucify.gif" border="0" alt="">
Es geht nicht um unkreativ, der Frager wollte Wissen, wie man default Werte mit JS anlegt.
Was ich gezeigt habe - kompatibel zu JS 1.0. :-)
Und wie sieht es bei einem Leerstring aus?
Dann würde dein Alert auch ein "" zeigen. Denn x ist dann ja auch leer und nicht mehr undefiniert (bei typeof sollte es auch so sein).
Die sauberste Methode ist den Parameter mit typeof abfragen, da das genau das ist was der Frager Wissen wollte. Deine Lösung ist die Antwort auf die Frage, wie kann ich einen Wert vorbelegen, wenn der Parameter unwahr ist.
Und *genau das* wollte der Frager auch wissen (lies nochmal nach)! Meine Variante (OK, jedenfalls ergänzt mit der Abfrage x==0 - brauche ich selten, da mein Defaultwert i.d.R. 0 ist :)) entspricht *exakt* dem vom Frager als Refrenz genannten Verhalten von PHP.<img src="http://www.vampirehost.de/pzn/texte/img/znaika.gif" border="0" alt="">
so sieht's aus. Mit deiner Variante hatte ich schon desöfteren Probleme, da ich meistens setter und getter Funktionen in einer nutze und ein Leerstring oder null fast immer gültige Werte für Parameter sind.
Dann ist der Fehler vielleicht woanders. Denn "meine" Variante funktioniert sowohl mit 0, als auch mit "" (sicherheitshalber eben nochmal getestet 8-)).
Gruß, Cybaer
Es geht nicht um unkreativ, der Frager wollte Wissen, wie man default Werte mit JS anlegt.
Was ich gezeigt habe - kompatibel zu JS 1.0. :-)
Und wie sieht es bei einem Leerstring aus?
Dann würde dein Alert auch ein "" zeigen. Denn x ist dann ja auch leer und nicht mehr undefiniert (bei typeof sollte es auch so sein).
Aber ein Leerstring ist unwahr. Das heißt mit deiner Variante kannst du x nicht mehr leermachen. Das Problem wenn du z.b. ein einen Inhalt eines Formularfelds leeren möchtest. zeigt deine Variante den Defaultwert an und keinen Leerstring.
Die sauberste Methode ist den Parameter mit typeof abfragen, da das genau das ist was der Frager Wissen wollte. Deine Lösung ist die Antwort auf die Frage, wie kann ich einen Wert vorbelegen, wenn der Parameter unwahr ist.
Und *genau das* wollte der Frager auch wissen (lies nochmal nach)! Meine Variante (OK, jedenfalls ergänzt mit der Abfrage x==0 - brauche ich selten, da mein Defaultwert i.d.R. 0 ist :)) entspricht *exakt* dem vom Frager als Refrenz genannten Verhalten von PHP.<img src="http://www.vampirehost.de/pzn/texte/img/znaika.gif" border="0" alt="">
Dann ist PHP in diesem Punkt fehlerhaft umgesetzt, was ich aber nicht glaube.
das Fragezeichen prüft ob eine ausdruck wahr ist und ein Ausdruck ist wahr, wenn er ungleich 0, null, kein Leerstring oder true ist, das sind aber alles definierte Werte, dass heißt es ist ein großer Unterschied ob du nur auf unwahr oder wahr prüfst, so wie du es machst oder auf definiert oder nicht definiert.
so sieht's aus. Mit deiner Variante hatte ich schon desöfteren Probleme, da ich meistens setter und getter Funktionen in einer nutze und ein Leerstring oder null fast immer gültige Werte für Parameter sind.
Dann ist der Fehler vielleicht woanders. Denn "meine" Variante funktioniert sowohl mit 0, als auch mit "" (sicherheitshalber eben nochmal getestet 8-)).
Nein tut sie nicht.
Wenn du einen Wert auf 0, null oder einem Leerstring setzten willst, dann funktioniert sie nicht mehr. Und das kommt in der Praxis öfters vor. zumindest wenn mit Objekten arbeitest und dort eine Eigenschaft mit einem Leerstring belegen willst oder eine Unterobjekt auf null setzten, kannst du dies mit deiner Funktion nicht mehr.
Insofern ist deine Varinate in vielen Fällen nützlich, deckt aber nicht alle Fälle ab, im gegensatz zu der typeof Variante.
Struppi.
Hi,
Aber ein Leerstring ist unwahr.
Nö. Ein Leerstring ist nicht unwahr, er wird in einer Bedingung wie unwahr behandelt. Das ist ein *großer* Unterschied.<img src="http://www.vampirehost.de/pzn/texte/img/motz.gif" border="0" alt="">
Das heißt mit deiner Variante kannst du x nicht mehr leermachen. Das Problem wenn du z.b. ein einen Inhalt eines Formularfelds leeren möchtest. zeigt deine Variante den Defaultwert an und keinen Leerstring.
? Ich habe doch *ausdrücklich* geschrieben, daß "meine" Variante korrekterweise den Leerstring nimmt, wenn er übergeben wurde. Überprüf doch im Zweifel den Code, bevor Du eine Routine bezweifelst, von der der Autor auch noch sagt, er hätte sie sicherheitshalber sogar nochmal überprüft (extra für Dich - mit Küßchen und Puderzucker obendrauf).<img src="http://www.vampirehost.de/pzn/texte/img/whowkiss.gif" border="0" alt="">
<img src="http://www.vampirehost.de/pzn/texte/img/gruebel.gif" border="0" alt=""> Denn natürlich kennst auch Du die JavaScript-Typ-Konvertierung, die nur bei "===" nicht greift (na ja, "===" gibt es ja auch auch nicht in JS 1.0 ;)). Und also ist "" wahr, denn x==0 ist zu erfüllen. Dank Konvertierung wird aber "" zu 0 (ebenso übrigens wie false, falls Du das noch irgendwann aus dem Ärmel ziehen solltest<img src="http://www.vampirehost.de/pzn/texte/img/sleep.gif" border="0" alt="">).
Dann ist PHP in diesem Punkt fehlerhaft umgesetzt, was ich aber nicht glaube.
? Ähm, mal simpel gefragt: Du kennst/kannst aber PHP?
PHP:
function test(x="default") {
echo x;
}
test();
JS:
function test(x) {
x=(x || x==0)?x:"default";
document.write(x);
}
test();
Beidesmal ist das Ergebnis gleich, egal ob und was Du test() mit auf den Weg gibst. Ich sehe da auch keinerlei "Unlogik" oder falsches Verhalten. Sollte mir jetzt jemand nahebringen können, was sich nun wobei "fehlerhaft" verhält, will ich es gerne überdenken. :-)
das Fragezeichen prüft ob eine ausdruck wahr ist und ein Ausdruck ist wahr, wenn er ungleich 0, null, kein Leerstring oder true ist, das sind aber alles definierte Werte, dass heißt es ist ein großer Unterschied ob du nur auf unwahr oder wahr prüfst, so wie du es machst oder auf definiert oder nicht definiert.
Keineswegs. Ich prüfe auf undefiniert - nur eben ohne typeof. Ist etwas definiert aber leer, 0 oder false, dann ist es für JS (dank Typ-Konvertierung) auch 0. Ob Du das magst oder nicht glaubst, spielt keine Rolle. Das ist halt so bei JS definiert. Es ist also systemimmanent und nicht zu ändern (mithin verläßlich).
Wenn du einen Wert auf 0, null oder einem Leerstring setzten willst, dann funktioniert sie nicht mehr.
OK, einigen wir uns darauf: Es funktioniert nicht - nur ich habe so abstruse Browser, wo es funktioniert. Du hast Recht, ich meine Browser und meine Ruhe ...<img src="http://www.vampirehost.de/pzn/texte/img/silly.gif" border="0" alt="">
Gruß, Cybaer<img src="http://www.vampirehost.de/pzn/texte/img/sid.gif" border="0" alt="">
Natürlichbei PHP mit dder Variablenkennzeichnung. =;-)
Also:
function test($x="default") {
echo $x;
}
test();
Gruß, Cybaer
<img src="http://www.vampirehost.de/pzn/texte/img/gruebel.gif" border="0" alt=""> Denn natürlich kennst auch Du die JavaScript-Typ-Konvertierung, die nur bei "===" nicht greift (na ja, "===" gibt es ja auch auch nicht in JS 1.0 ;)). Und also ist "" wahr, denn x==0 ist zu erfüllen. Dank Konvertierung wird aber "" zu 0 (ebenso übrigens wie false, falls Du das noch irgendwann aus dem Ärmel ziehen solltest<img src="http://www.vampirehost.de/pzn/texte/img/sleep.gif" border="0" alt="">).
OK, dann musst da aber noch auf 'null' prüfen falls der Parameter ein Objekt sein kann, dann hast du drei Vergleiche statt einem.
function test(x)
{
this.x = null;;
this.y = null;;
}
test.prototype.X = function(x)
{
this.x = (x || x==0)? x : "default";
return this.x;
}
test.prototype.Y = function(y)
{
this.y = typeof y != 'undefined' ? y : "default";
return this.y;
}
var t = new test();
// X
t.X(null);
alert( 'x=' + t.x );
t.X('');
alert( 'x=' + t.x );
t.X(0);
alert( 'x=' + t.x );
// Y
t.Y(null);
alert( 'y=' + t.y );
t.Y('');
alert( 'y=' + t.y );
t.Y(0);
alert( 'y=' + t.y );
Dann ist PHP in diesem Punkt fehlerhaft umgesetzt, was ich aber nicht glaube.
? Ähm, mal simpel gefragt: Du kennst/kannst aber PHP?
Nein.
PHP:
function test(x="default") {
echo x;
}
test();JS:
function test(x) {
x=(x || x==0)?x:"default";
document.write(x);
}
test();
wie gesagt sollte das nicht das gleiche sein. Das einzige 100% richtige ist, zu testen, ob der Parameter wirklich undefiniert ist. Deine variante mag in 99.9% der Fälle funktionieren, ist aber nicht das gleiche.
Keineswegs. Ich prüfe auf undefiniert - nur eben ohne typeof. Ist etwas definiert aber leer, 0 oder false, dann ist es für JS (dank Typ-Konvertierung) auch 0. Ob Du das magst oder nicht glaubst, spielt keine Rolle. Das ist halt so bei JS definiert. Es ist also systemimmanent und nicht zu ändern (mithin verläßlich).
Nein, du prüfst nicht auf definiert.
undefiniert ist immer nur typeof == 'undefiniert' alles andere mag in vielen Fällen funktionieren, in manchen aber nicht.
Ich versteh auch nicht warum du es für sinnvolller erachtest zwei Vergeleiche zu machen statt einem.
Struppi.
Hi,
also wenn ich mit prototype arbeite, dann kann ich auch mit typeof arbeiten. Denn wenn prototype funktioniert, dann funktioniert auch typeof! 8-))
wie gesagt sollte das nicht das gleiche sein. Das einzige 100% richtige ist, zu testen, ob der Parameter wirklich undefiniert ist. Deine variante mag in 99.9% der Fälle funktionieren, ist aber nicht das gleiche.
*Verglichen mit PHP* ist es auf jeden Fall das gleiche. Daß "meine" Variante aber nicht das gleiche ist wie typeof, ist klar. typeof kann ja nun noch einiges mehr (heißt ja auch TypeOf nicht IsDefined). ;-))
Nein, du prüfst nicht auf definiert.
undefiniert ist immer nur typeof == 'undefiniert' alles andere mag in vielen Fällen funktionieren, in manchen aber nicht.
In JS 1.0 ist es gar die einzige Möglichkeit, die funktioniert, während ein "typeof-Script" erst gar nicht funktioniert.
Ich versteh auch nicht warum du es für sinnvolller erachtest zwei Vergeleiche zu machen statt einem.
Und ich verstehe nicht, wieso man ohne Not etwas verwenden soll, für das es eine einfache und abwärtskompatible Alternative gibt (genauso wie ich z.B. auch ein substring() jederzeit einem substr() vorziehe, da ersteres, bei gleicher Funktionalität, auch mit JS 1.0 funktioniert, letzteres aber erst ab JS 1.1; oder ich bevorzuge eine eigene search/replace-Routine, da die ab JS 1.0 funktioniert, während replace() JS 1.2 benötigt; ...).
Ich habe keinen Einfuß auf den Surfer. Ich kann mich mit 99,99% Reichweite zufrieden geben, muß ich aber nicht (zumal wenn es mich nicht mehr Aufwand kostet - was es nicht tut, da ich ja schon seit der 1.0er in JavaScript programmiere). Und alleine, daß *mir* *meine* Browser Fehler melden (und die Skripte dann gar nicht mehr ausführen), wenn ich mal wieder einen "Generalcheck" vornehme, ist für mich mehr als Grund genug.
Gruß, Cybaer
PS: Natürlich verwende ich *auch* typeof oder replace() (wie auch ein Blick die Sourcen meines "Coding-Schatzkästleins" zeigt). Aber eben *nur* dort, wo ich *wirklich* drauf angewiesen bin. Und *dann* sorge ich halt anderweitig dafür, daß ein JS-1.0-(oder 1.1- oder 1.2- oder 1.3-)Browser beim Ausführen (bzw. schon beim Parsen) des Scriptes nicht abbricht. So mache ich das mit allen neuen "JS-Errungenschaft", eben bis hin zur aktuellen JS-Version ...
wie gesagt sollte das nicht das gleiche sein. Das einzige 100% richtige ist, zu testen, ob der Parameter wirklich undefiniert ist. Deine variante mag in 99.9% der Fälle funktionieren, ist aber nicht das gleiche.
*Verglichen mit PHP* ist es auf jeden Fall das gleiche. Daß "meine" Variante aber nicht das gleiche ist wie typeof, ist klar. typeof kann ja nun noch einiges mehr (heißt ja auch TypeOf nicht IsDefined). ;-))
Echt?
Ich kann nur von Perl sprechen und da ist es ebenfalls notwendig auf undef zu testen (dort ist es ein Schlüßelwort), da ansonsten einiges schief gehen kann.
In JS 1.0 ist es gar die einzige Möglichkeit, die funktioniert, während ein "typeof-Script" erst gar nicht funktioniert.
also fassen wir zusammen:
einen default in einer Funktion erzeugt man so:
function test(x)
{
if(typeof x == 'undefined') x = 'default';
}
Will der Frager die Browser der 2. Generation unterstützen, muss er es so machen:
function test(x)
{
if(!x && x !=0 ) x = 'default';
}
Struppi.
Hi,
also fassen wir zusammen:
Will der Frager die Browser der 2. Generation unterstützen, muss er es so machen:
Netter Versuch! ;)
Zwar stimme ich dir von der Auswirkung her zu, würde es aber anders formulieren:
Einen Default-Wert kann ich mit if setzen. Sollte dies, aus welchen Gründen auch immer, ausnahmsweise nicht möglich sein, muß ich notgedrungen eine neueres Verfahren nehmen, das Browser/Surfer ausschließt! :-))
Gruß, Cybaer
Netter Versuch! ;)
dito.
Zwar stimme ich dir von der Auswirkung her zu, würde es aber anders formulieren:
Einen Default-Wert kann ich mit if setzen. Sollte dies, aus welchen Gründen auch immer, ausnahmsweise nicht möglich sein, muß ich notgedrungen eine neueres Verfahren nehmen, das Browser/Surfer ausschließt! :-))
Oder genauer: einen default Wert kann ich umständlich mit Hilfe mindestens dreier Vergleiche (wenn den die automatische Typekonvertierung in so alten Browsern greift) setzen, wenn ich Browser unterstützen will oder muss die älter als 10 Jahre sind, oder ich benutze ein einfaches und sicheres Verfahren, dass mindestens seit der 3'er Browsergeneration funktioniert.
Struppi.
Hi,
Oder genauer: einen default Wert kann ich umständlich mit Hilfe mindestens dreier Vergleiche
:)
Wie ich schon schrieb: Ich als Programmierer weiß ja, was ich tue (jedenfalls sollte ich das ;-)). Und i.d.R. brauche ich *keine* weitere Vergleiche, da der Default-Wert i.d.R. 0 sein soll (bzw. bei meinen Scripts halt ist) - und ich (nur) *bei Bedarf* auch typeof verwende. :-)
Gruß, Cybaer
Hallo,
PHP:
function test($x="default") {
echo $x;
}
test();JS:
function test(x) {
x=(x || x==0)?x:"default";
document.write(x);
}
test();Beidesmal ist das Ergebnis gleich, egal ob und was Du test() mit auf den Weg gibst. Ich sehe da auch keinerlei "Unlogik" oder falsches Verhalten.
Nein. Wenn man den Parameter null übergibt, was in gewissen Kontexten notwendig ist, wird $x in PHP null. In JavaScript hingegen wird er 'default'. PHP und deine JavaScript-Variante gleichen sich im besagten Punkt nicht. Darauf will Struppi doch die ganze Zeit hinaus.
Mathias
Hi,
PHP und deine JavaScript-Variante gleichen sich im besagten Punkt nicht. Darauf will Struppi doch die ganze Zeit hinaus.
"Die ganze Zeit"? Na ja. ;-)
Und ich will darauf hinaus (s. auch Ergänzung auf 0): *Ich* als Programmierer weiß, worauf *ich* zu achten habe - und ich kann dementsprechend programmieren. Selbst wenn etwas nur in 99,9% der Fälle funktioniert, ist das kein Problem, denn für die restlichen 0,1% kann *ich* mir eine andere Lösung suchen (in diesem Fall also eine "Doppelabfrage", wie Struppi es nannte, oder eben auch typeof). Worauf ich als Programmierer aber keinen Einfluß habe, ist der Surfer und seine Softwareausstattung. Wenn ich also eine Lösung nehme, die unnötigerweise nur auf 99,9% der Browser läuft, dann sind 0,1% der Surfer unnötigerweise ausgeschlossen.
Es reicht absolut, wenn ich *die* Surfer (problemlos) ausschließe, deren Hardware/Software wirklich nicht geeignet ist, die Aufgabe, die ich bewältigen möchte, zu lösen.
Und hierbei geht es nicht um "Mehraufwand" à la einen Zweig für diesen, einen anderen für jenen Browser ...
Gruß, Cybaer
PHP und deine JavaScript-Variante gleichen sich im besagten Punkt nicht. Darauf will Struppi doch die ganze Zeit hinaus.
"Die ganze Zeit"? Na ja. ;-)
Natürlich ging es die ganze Diskussion darum, dass typeof == 'undefined' etwas anderes ist als x ? ... und das etwas anderes passieren kann.
Wie immer wenn du diskutierst versuchst du die Unzulänglichkeiten deiner Varianten mit Workarounds zu umschiffen um dann hinterher zu erklären dass alles in Ordnung ist (genau wie bei der Frames diskussion).
Die Frage war, wie man einen Defaultwert für eine Funktion erzeugt. Programmiertechnisch wird dieser genutzt, wenn es keinen Parameter gibt und dies ist nur dann der Fall, wenn der Parameter vom Typ 'undefined' ist.
Und ich will darauf hinaus (s. auch Ergänzung auf 0): *Ich* als Programmierer weiß, worauf *ich* zu achten habe - und ich kann dementsprechend programmieren. Selbst wenn etwas nur in 99,9% der Fälle funktioniert, ist das kein Problem, denn für die restlichen 0,1% kann *ich* mir eine andere Lösung suchen (in diesem Fall also eine "Doppelabfrage", wie Struppi es nannte, oder eben auch typeof). Worauf ich als Programmierer aber keinen Einfluß habe, ist der Surfer und seine Softwareausstattung. Wenn ich also eine Lösung nehme, die unnötigerweise nur auf 99,9% der Browser läuft, dann sind 0,1% der Surfer unnötigerweise ausgeschlossen.
Der Test auf typeof ist etwas komplett anderes als was du machst, man kann es mit deiner zwar simulieren das ist aber uneffektiv. Daher hättest du sagen sollen, 'früher machte man es so...'
Deine Argumentation das es JS Versionen gibt, in denen typeof noch nicht existiert ist zwar richtig, spielt aber in der Praxis keine Rolle, da es 1.) kaum jemand geben wird, der Skripte schreibt, die überhaupt noch auf so alten Browsern laufen und 2.) diejenigen die mit sochen Browsern surfen mit Sicherheit JS ausschalten (ich selber nutze noch hin und wieder den NC 3), da du auf ca. 70% aller Seiten eine oder mehrere Fehlermeldung erhälst (bei diesen Browsern ging noch bei jeder Fehlermeldung ein popup auf) und der Browser permanent abstürzt. D.h. du schließt die surfer nur aus, wenn du eine Funktionalität anbietest, die sich ohne JS nicht umsetzten läßt bzw. du den Fehler machst ein JS als notwendig anzusehen und es nicht notwendig wäre.
Aber wie so oft - das ist eine nutzlose Diskussion. Ich weiß es, du weißt es, Mathias und ein paar andere Wissen es, daß es Historische Versionen von JS gab (versuch mal ein sinnnvolles Skript auf dem IE 3 zum laufen zu kriegen), dass ist für uns aus nostalgischer Sicht vielleicht interessant, aber ob dass hier jemand wirklich Wissen will, wenn er fragt, halte ich für sehr zweifelhaft.
Was mich noch interessiert ist, ob die Typenkonvertierung bei älteren Browsern wirklich das macht was du sagst?
Also ist, false und "" gleich 0?
Struppi.
Hi,
Natürlich ging es die ganze Diskussion darum, dass typeof == 'undefined' etwas anderes ist als x ? ... und das etwas anderes passieren kann.
... worauf ich als Programmierer direkt Einfluß habe.
Auf den Surfer habe ich den halt nicht.
Wie immer wenn du diskutierst versuchst du die Unzulänglichkeiten deiner Varianten mit Workarounds zu umschiffen um dann hinterher zu erklären dass alles in Ordnung ist (genau wie bei der Frames diskussion).
Nun, *offensichtlich* sehe ich manche Dinge *prinzipiell* anders, als der "Mainstream der hier veröffentlichten Meinung"! ;-) Da könntest Du noch weitere hiesige Posts von mir durchgehen. 8-)) Nichtsdestotrotz postuliere ich meine "abweichenden Meinungen" und vertrete sie gar offensiv. Das wird sich auch nicht ändern - jedenfalls nicht ohne Grund - und schon gar nicht durch Versuche, sie mit Begriffen wie "Workarounds" zu belegen. ;)
Für mich ist z.B. ein "Workaround" das herumarbeiten/korrigieren eines Fehlers/nicht-standard-konformen Verhaltens. Davon kann hier jedoch (ebensowie aber auch bei der "Framesdiskussion" und anderen entsprechenden Beispielen), überhaupt kein Thema sein! Deswegen wirkt der Begriff auf mich in solchen Situationen eher wie ein gezielter Diffamierungsversuch (na ja, klingt jetzt schlimmer, als ich es bewerte/empfinde =;-)), was mich vollkommen kalt läßt, und IMHO auf denjenigen zurückfällt, der so unbedacht seine Worte wählt. ;-}
Beispiel (ja, ja - der "Hinkehinweis" ist schon im voraus eingeplant ;-)):
Q: Ich möchte an meinem Auto die Reifen wechseln. Wie mache ich das?
A1: Dafür nimmt man eine Hebebühne, und dann ...
A2: Du kannst dich aber nicht darauf verlassen, immer eine Hebebühne nutzen zu können. Du kannst auch einfach einen Wagenheber nehmen. Das geht dann so: ...
A1: Um Himmelswillen! Das ist doch ein Workaround und klappt nicht immer. In jeder Stadt findest Du heutzutage eine Hebebühne!
A2: Wenn mir definitiv eine zur Verfügung steht oder ich wirklich eine brauche, kann man sie natürlich nehmen (mache ich ja auch). Du weißt aber nicht, wann Du mal wechseln mußt, und kannst dich nicht darauf verlassen, eine Hebebühne zur Verfügung zu haben. Besser also, wenn man weiß, wie man mit einem Wagenheber umgeht - der ist in jedem Auto vorhanden ud somit *immer* nutzbar.
;-))
Deine Argumentation das es JS Versionen gibt, in denen typeof noch nicht existiert ist zwar richtig, spielt aber in der Praxis keine Rolle, da es 1.) kaum jemand geben wird, der Skripte schreibt, die überhaupt noch auf so alten Browsern laufen
Ja, leider. Vielleicht weil sich bei Webseite so viele Gelegenheits-"Programmierer" versuchen. Genauso wie es viele Gelegenheits-"Webdesigner" gibt, deren Seiten z.B. nur auf dem IE laufen (was ich, übrigens auch im Gegensatz zum hiesigen "Mainstream", *nicht* verurteile oder mit hämischen Kommentaren bedenke - ich postuliere halt "nur" andere Sichtweisen/Möglichkeiten).
Gibt ja nun wirklich genug Beispiele im Web, wo Code z.B. JS 1.5 ungetestet voraussetzt (oder IE-DOM, oder ...), und dann auf immer noch genutzten 1.3er-Browsern tutto komletto streikt. Was ist damit bewiesen? Daß man es anders (ich meine: besser) machen kann, wenn man nur Rücksicht nimmt und das Hirn einschaltet (keine Rede von "Mehrarbeit"! - und das Nachdenken muß ja auch sein, damit die Scripte nicht nur auf älteren, sondern auch auf zukünftigen Browsern laufen).
Daß ich *prinzipiell* so agiere, daraus habe ich nie einen Hehl gemacht (egal ob von JS 1.0 auf 1.1, auf 1.2, auf 1.3, auf 1.5, oder von HTML 1 auf 2, auf 3, auf 4, ...). Wo setzt *Du* deine Grenze, potentielle Nutzer ohne Not auszuschließen? Schließt Du nur JS-1.0-Surfer aus? Oder auch 1.1er? 1.3er? Nicht-IEs? Nicht-Flasher?
Ich frage mich das halt *überhaupt* nicht! Für mich ist jeder willkommen (halt von meinem Ursprung her "Verkäufer 'alter Schule'" - bereits mit väterlichen Genen und der Muttermilch so konditioniert 8-)). Und jeder wird nach besten Kräften unterstützt (OK, da wo diese Unterstützung in Mehrarbeit wie unterschiedlichen Parallel-Implementatioen mündet, überlege ich ein paar mal =;-) - aber das war ja hier nicht das Thema).
Aber wie so oft - das ist eine nutzlose Diskussion. Ich weiß es, du weißt es, Mathias und ein paar andere Wissen es,
Natürlich. :-))
daß es Historische Versionen von JS gab (versuch mal ein sinnnvolles Skript auf dem IE 3 zum laufen zu kriegen),
Also in meinem "Coding-Schätzkästlein" findest Du welche. Steht immer dabei, ab welcher JS-Verion sie funktionieren; JS 1.0 ist auch dabei.
Ein Größeres ist die Ermittlung der "Systemvariablen" http://Coding.vampirehost.de/Systemvariable. Die funktioniert auch problemlos z.B. mit Navigator 2 (also JS 1.0). Und sinnvoll ist das Script wohl auch - jedenfalls wenn man das am Bedarf mißt, der sich mir durch die Suchmaschinenanfragen auftut. ;)
Und die anderen Scripts sind so geschrieben/definiert, daß sie mit Browsern, die deren Funktionalität nun nicht (oder nur mit entsprechendem *Mehraufwand*) nutzen können, wenigstens friedlich und fehlerlos koexistieren.
Wenn mich also jemand fragt/mir mailt: Sag mal, auf welchen Browsern laufen deine Werke? Kann es irgendwo Probleme geben?, dann muß ich nicht nachschauen, überlegen und dann antworten: x. Browser-Generation problemlos, davor: ? - aberds psielt doch heutzutag keine Rolle mehr, versprochen!
Ich grunze vielmehr eine, ohne nachschauen zu müssende "1Answer4All"-Antwort: ein (zugegebenermaßen) selbstzufriedenes "Funktionalität y setzt Browsergeneration x voraus - Probleme gibt es aber auf *keinem* Browser, egal welcher Generation (jedenfalls im Normalfall - kann ja sein, daß ein Browser auch einen üblen Bug hat)."
dass ist für uns aus nostalgischer Sicht vielleicht interessant, aber ob dass hier jemand wirklich Wissen will, wenn er fragt, halte ich für sehr zweifelhaft.
Er will es bestimmt nicht wissen, weil er i.d.R. soweit gar nicht denken *kann* (mangels Erfahrung). *Ich* habe Erfahrung, und wenn ich die in meine Tips nicht einfließen lassen wollte, könnte ich sie mir IMHO auch gleich verkneifen - denn der Fragesteller sucht explizit nach "Erfahrung" (also bereits vorhandenen Lösungen).
Was mich noch interessiert ist, ob die Typenkonvertierung bei älteren Browsern wirklich das macht was du sagst?
Also ist, false und "" gleich 0?
Ja, die Typ-Konvertierung ist in der Grunddefinition von JS (weil dem so ist, hat man ja in einer späteren Version auch noch extra den "Vergleichsoperator ohne Typ-Konvertierung", "===", eingeführt 8-)). Von der Theorie abgesehen, pflege ich meine Scripte praktisch auch mit JS-1.0-Browsern zu testen ... ;-)
Gruß, Cybaer
PS: Und wenn ich gehässig wäre, könnte ich noch anfügen: Hey, *ich* kenne typeof und nutze es selbst. Ich kenne auch die Typ-Konvertierung und nutze sie selbst. Ich entscheide als Programmierer, welche Variante aus den mir zur Verfügung stehenden Möglichkeiten ich verwenden kann bzw. muß. Du kennst/kanntest nicht alle Varianten, bist aber der Meinung, daß die einzige, die *Du* kennst, auch die einzige "Richtige" ist. Ich bin beeindruckt ...
Aber gut, daß ich nicht gehässig bin! ;-) (nein, ehrlich nicht: Mit einem echt netten Lächeln hinterher!! :-))
PPS: Ich weiß, daß nict jeder so denken kann/will/möchte, wie ich es tue (bin ja auch ein Individuum ;-)) Aber *wenn* alle es täten, *dann* wäre das Internet unter Garantie problemloser/fehlerfreier und komfortabler nutzbar, als es real der Fall ist. :)
PPPS: Hey, ich muß heute auch noch was arbeiten! =;-))))