• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Wie nennt man dieses Konstrukt: var x = ( a || b );

Elma

New member
Moin.

Beim Lesen von Quelltexten zu Lernzwecken (Wie setzen andere etwas um), bin ich über folgendes Konstrukt gestoßen:

var x = ( a || b );

Wie nennt man dieses Konstrukt? Damit ich nach weitere Erklärungen googeln kann.

Es arbeitet so:
Wenn a einen Wert hat, also nicht "undefined" ist, wird x auf a gesetzt, ansonsten wird x auf b gesetzt.

Grüße
 
das ist eine logische oder verknüpfung
dabei nutzt man aus, dass bei der ausführung nach dem 1. ausdruck der nicht false ergibt abgebrochen wird genau wie bei einer logischen und verknüpfung nach dem 1. ausdruck der false ergibt abgebrochen wird.
sprich wenn du schreibst
Code:
var xxx = null;
if (xxx && xxx[0] && xxx[0].length)
wird nur xxx angesehen und dann abgebrtochen, sonst worde es ja einen laufzeitfehler geben. bei
Code:
var xxx = [{}];
if (xxx && xxx[0] && xxx[0].length)
werden nur die 1. beiden ausgewertet und bei
Code:
var xxx = [""];
if (xxx && xxx[0] && xxx[0].length)
alle 3
mit oder ist es genauso
Code:
function xxx()
{
  return true;
}
function yyy()
{
  alert("wird nicht aufgeruefen");
  return true;
}
if (xxx() || yyy())
die funktion yyy wird nicht aufgerufen, weil xxx einen wert zurückgibt der zu true gekastet werden kann, bzw. schon true ist.
das problem bei var xxx = a || b; kann dabei sein, daß du auch werte zuweisen möchtest die zu false gekastet werden können.
Code:
function xxx(a)
{
  return a || "defaultwert";
}
alert(xxx());          // "defaultwert" => gewollt
alert(xxx(""));        // "defaultwert" => muss nicht gewollt sein 
alert(xxx("wert"));  // "wert" => gewollt
 
Danke.

Wie könnte man folgenden Code per Shorthand schreiben, so dass der Variable test nur dann der Wert aus somevar zugewiesen wird, wenn sie existiert. ansonsten wird ein Standardwert genommen:

var test="";
if (typeof(somevar)!="undefined") test=somevar;
else test="Standardwert";
alert(test);

Wenn ich einfach schreibe var test = (somevar || "Standardwert") kommt es zu einem Fehler.
 
Elma schrieb:
Beim Lesen von Quelltexten zu Lernzwecken (Wie setzen andere etwas um),
Find ich in Ordnung, mann lernt immer von seinem Meister ist in jedem Beruf so.

Allerdings ist dieses Beispiel var x = ( a || b ) schon wider etwas was gerne in asm.js Code vorkommt.
Da findet man allerhand Kurzschreibweisen.
z.B
https://github.com/echo66/PhaseVocoderJS/blob/fcf4ec4fbe50f03284e483f142f68c883ac4e83d/fft-module.js
allein die for schleife:
for(mh=1;(m=mh<<1)<=(sz|0);mh=m) {

EmScripten code ist noch schlimmer aber das schreibt man ja auch nicht von Hand.
 
Zuletzt bearbeitet:
Nein, wenn die Variable somevar nicht existiert (also nicht deklarier ist), kann man die Kurzschreibweise nicht verwenden. typeof ist da ein spezieller Operator, der auch auf nicht definierten Variablen ausgeführt werden kann. Sonst liefert das immer einen ReferenceError.
 
ja, das hatte ich übersehen,
dann kannst du
Code:
var test = window.somevar || "Standardwert";
schreiben, wenn es sich um eine globale variable handelt, für eine lokale variable sollte man wissen ob sie definiert ist oder nicht.
 
Wie könnte man folgenden Code per Shorthand schreiben, so dass der Variable test nur dann der Wert aus somevar zugewiesen wird, wenn sie existiert. ansonsten wird ein Standardwert genommen:
var test="";
if (typeof(somevar)!="undefined") test=somevar;
else test="Standardwert";
alert(test);
´
dafür gibt es eine Abkürzung die in vielen Progammiersprachen verwendet wird.
PHP:
var test="";

typeof(somevar)!="undefined" ? test=somevar : test="Standardwert";

alert(test);
 
Zuletzt bearbeitet von einem Moderator:
ja kann man so verwenden und man kann sich daran gewöhnen.Ich selber verzichte darauf wenn ich kann. Weil die dinger sind meiner meinung aus einer Zeit wo die Kisten nur MAX 16 - 32 MB Arbeitsspeicher hatten.
und Operatoren oft mehrfach verwendung hatten wie der * zb . Ich habs lieber übersichtlich, mir gefallen konstrukte wie Setter und Getter by C# z.b sehr gut. Unsere Kisten haben ja alle schon MIN 4GB allerdings mit 64bit Prozessoren und mehrkernen da muss man schon sparen mit dem Code :) und er Übersichtlichkeit. Gut ich gebe zu man gewöhnt sich dran auch an die vielen überzähligen Klammern in JQuery.
 
irgendwie reden wir glaube ich gerade aneinander vorbei.
was ich meinte: der ?:eek:perator gibt einen wert zurück abhängig von einer bedingung. dann sollte man das auch so machen, klar kannst du auch die zuweisung in den ausdruck packen, dann musst du ihn aber 2 mal hinschreiben und konsistent halten.
was du mit arbeitsspeicher meinst kann ich jetzt nicht nachvollziehen. arbeitsspeicher kostet das nicht mehr oder weniger als ein if-else weil es auf den selben zwischencode hinausläuft.
Operatoren oft mehrfach verwendung hatten wie der * zb
versteh ich auch nicht, meinst du mult. und derefenzierung in c++? die anzahl der sonderzeichen ist begrenzt.

mir gefallen konstrukte wie Setter und Getter by C# z.b sehr gut
hatten wir hier auch schon ein paar mal, die sind meiner meinung nach nicht gut, da sie verbergen, daß die variable gekapselt ist. für den anwender einer get/set funktion sieht es aus als würde er auf eine variable eines objektes zugreifen was einen aus oop sicht erschrecken sollte.
 
andreax schrieb:
Ich selber verzichte darauf wenn ich kann. Weil die dinger sind meiner meinung aus einer Zeit wo die Kisten nur MAX 16 - 32 MB Arbeitsspeicher hatten.
doch den Ternary Operator braucht man sehr wohl.
z.B bei einer Lautstärkereglung wenn man die Ausgabe nachmals ums 0.5fache verringern möchte.
das geht solange gut bis der User via Slider oder wie auch immer 0.5 erreicht den 0.5*0.5 ist 1.

var mult = 0.4
var val = mult === 0.5 ? 0.5 : mult*0.5;
console.log(val);//0.2


Das ginge auch mit if, ist aber unhüpsch und würde in mit mehr
andreax schrieb:
enden

PS: Jquery und klammern ist noch nix Asynchroner code da wird lustig habe da in nodejs so einige Dinger druch. Mal schnell copy paste ist da nicht.
 
irgendwie reden wir glaube ich gerade aneinander vorbei.
JA :)

Es ist mir die Erste wie auch die Zweite Schreibweise zu unübersichtlich und weil es sonst keinen Vorteil zu haben scheint nehme ich lieber ein normales if else.

Das mit den c c++ Operatoren ist ein schlechter Vergleich.
Mir scheint das damals der speicher für die Compiler eng war oder auch heute noch in microcontrollern ist und daher solche Konstrukte entstanden sind.

Ein Setter ist eine Setter und ein Getter ist eine Getter Methode so einfach ists oder möcht ichs haben :)
 
Es ist mir die Erste wie auch die Zweite Schreibweise zu unübersichtlich und weil es sonst keinen Vorteil zu haben scheint nehme ich lieber ein normales if else.
mir gehen die schneller ins auge

Mir scheint das damals der speicher für die Compiler eng war oder auch heute noch in microcontrollern ist und daher solche Konstrukte entstanden sind.
nee, mit speicher hat das nichts zu tun
und nochmal, der compiler erzeugt aus allen 3 konstrukten (fast) identischen maschinencode.
 
mir gehen die schneller ins auge

nee, mit speicher hat das nichts zu tun
und nochmal, der compiler erzeugt aus allen 3 konstrukten (fast) identischen maschinencode.

Ja das stimmt schon für den erzeugten Binärcode aber auch der Compiler und die c od cpp Quelldatei sind beim compilieren im Arbeitsspeicher.
und javascript als interpretierte Sprache wird zur Laufzeit im Browser interpretiert.
 
die c od cpp Quelldatei sind beim compilieren im Arbeitsspeicher.
und javascript als interpretierte Sprache wird zur Laufzeit im Browser interpretiert.
deswegen versucht aber keiner ein paar byte einzuspaaren und denkt sich deswegen operatoren mit wenig zeichen aus.
der ?: operator hat genau so seine berechtigung wie logische operatoren.
sonst hätten früher auch alle auf einrückungen verzichtet, hat aber keiner.
 
der ?: operator hat genau so seine berechtigung wie logische operatoren.
Berechtigug hab ich keinem Operator abgesprochen man soll sie verwenden wie man für nötig hält.
sonst hätten früher auch alle auf einrückungen verzichtet, hat aber keiner.

Wozu auch die Compiler ignorieren onehin Whitespaces und Umbrüche soweit ich weis.
Daher kann man in c auch nicht auf das Semikolon verzichten.

- - - Aktualisiert - - -

und hier das Ergebnis meiner google Abfrage warum c so kryptisch ist und da sie an ist der Autor ganz meiner Meinung auf Seite 7
 
Zuletzt bearbeitet von einem Moderator:
Wozu auch die Compiler ignorieren onehin Whitespaces und Umbrüche soweit ich weis.
ignorieren bedeutet aber nicht, dass sie nicht gelesen werden.

Daher kann man in c auch nicht auf das Semikolon verzichten.
das hat wiederum nichts mit leerzeichen oder umbrüchen zu tun. auf das semikolon sollte man auch in js nie verzichten.

da [...] ist der Autor ganz meiner Meinung
nicht meiner

Erfinder von UNIX und C geben zu: Alles Quatsch!

- - - Aktualisiert - - -

wobei pascal und c anfang der 70er entstanden sind. schon daran lässt sich erkennen, daß speicher keine rolle gespielt hat bei der sprachdefinition.
 
Zurück
Oben