2016-03-27 5 views
3

Sorry, ich bin ein bisschen wie ein Anfänger, wenn es um Javascript geht. Aber hier ist mein Problem: Die folgende Funktion gibt -1, wenn 0 inputed wirdJavascript logischer Operator || liest 0 als falschen Wert. Gibt es einen schönen Weg?

function foo(bar){ 
    return bar || -1; 
} 

foo(0); 

gibt es eine schöne und elegante Weise, die zu erlauben || Der Operator liest 0 (speziell 0, nicht alle falschen Werte) als gültigen Wert, so dass die Funktion 0 zurücksendet. Oder muss ich dies tun:

function foo(bar){ 
    if(bar === 0){ 
     return 0; 
    } else { 
     return bar || -1; 
    } 

} 

foo(0); 

Edit:

Vielen Dank an alle für eure Antworten! Für diejenigen, die sich wundern, wurde die Frage gestellt, um die Lösung für das gleiche Problem mit optionalen Parametern zu finden. Der folgende Code ist ein Beispiel dafür, wie er angewendet werden könnte.

function Point(x,y,meta){ //meta is an optional parameter. In this case I wanted to set meta to 0, but it was being set to null. 
    this.x = x; 
    this.y = y; 
    //this.meta = meta || null; This line is the old code that would set meta to null when 0 is inputed. 
    this.meta = meta === 0 ? 0 : (meta || null); //the fix suggested by many users is applied here. 
}; 

var foo = new Point(1,2,0); 
console.log(foo.meta); //foo.meta is now 0 instead of null! 
+1

In welchen Fällen möchten Sie '-1' erhalten, genau? Die Falsy-Werte sind "undefiniert", "null", "falsch", "+ 0", "-0", "NaN", "". – Oriol

+1

Zur Erinnerung, ich habe keine Ahnung, warum das abgelehnt werden würde. Truthy und Falsy Werte sind ein kompliziertes Thema in JS. Darüber hinaus erstellte das OP ein sehr prägnantes Beispiel für sein Problem, um seine Frage zu verdeutlichen. –

+0

'foo (Infinity)' Welche Ausgabe erwartest du hier? –

Antwort

1

Die engster Sie erhalten können, ist Ihre zusammenzubrechen if-else in zu einem einzigen Rückkehr, a la:

return bar === 0 ? bar : (bar || -1); 

Da || vergleicht truthy/falsy-Werte, Sie müssen den Fall 0 explizit behandeln (mit starker Typisierung).

Es ist schwer zu sagen von Ihrer Frage, aber in der Regel, wenn ich die truthy/falsy Art von Vergleichen überschreibe, ist es einen Wert zu default. In diesem Fall muss festgestellt werden, ob meine Funktion einen undefinierten Wert erhalten hat, und stattdessen ein normaler Standard verwendet werden.

+3

Dies gibt True zurück, wenn 'bar === 0'. –

+0

Dies ist sicherlich die "eleganteste" Lösung. –

+0

Ich habe das versucht, aber die Funktion gibt jetzt wahr zurück, wenn 0 eingegeben wird. –

1

Sie könnten foo wie folgt neu schreiben den ternären Operator:

function foo(bar) { 
    return bar === 0 ? 0 : (bar || -1) 
} 

Die Syntax für den ternären Operator ist condition ? expr1 : expr2. Wenn condition truthy ist, gibt es expr1 zurück, andernfalls wird expr2 zurückgegeben.

Here's more information on the ternary operator

+0

Ich mag die Erklärung von ternären! Vielleicht wäre es vorteilhaft, "wahr" zu "truthy" zu ändern, um es ein bisschen klarer zu machen, dass "wahr"? a: b' und '1? a: b' beide ergeben "a"? –

+0

Ja, das ist eine gute Idee, danke! – Addison

+0

Vielen Dank für Ihre Antwort! –

1

Das ist die Art und Weise JavaScript funktioniert. Alle Werte sind entweder truthy oder falsy. Null ist zufällig ein falscher Wert. Sie können Ihre Funktion jedoch mit einem Ternär vereinfachen.

function foo(bar) { 
    return bar === 0 ? 0 : (bar || -1); 
} 
+0

Vielen Dank für Ihre Antwort! –

1
function foo(bar){ 
    return typeof bar === "undefined" || bar === null ? -1 : bar; 
} 

foo(0); // should give 0 
foo(false); // should give false 
var a; // undefined variable 
foo(a); // should give -1 
foo(null); // should give -1 
var b = {}; // object 
foo(b.a); // should give -1 (undefined property) 

Nun, die Absicht dieser if ist für fehlende (nicht vorhanden) Wert zu überprüfen. In JavaScript fehlt der Wert, wenn er:

  1. undefined
  2. null

Der beste Weg, etwas für undefined zu überprüfen ist zu streng (===) zur Überprüfung seiner Typ für die Gleichstellung auf "undefined" string - so erhalten Sie keine Ausnahme, wenn bar nicht ausgewertet werden kann.

Aber, wenn Ihr Ausdruck nicht undefined ist, können Sie dann sicher seinen Wert mit Vergleich bar===null überprüfen.

So haben wir beide Fälle abgedeckt und wir erhalten keine Ausnahmen.

+0

Ich denke, das ist der beste Code, aber eine Erklärung dafür wäre hilfreich. – recursive

+0

Nun, die Absicht dieses "if" ist es, nach fehlenden (nicht vorhandenen) Werten zu suchen. In JavaScript fehlt der Wert, wenn er lautet: 1) 'undefined' 2)' null'. Der beste Weg, etwas auf "undefined" zu überprüfen, ist streng (===) überprüfen Sie seine ** Typ ** für die Gleichheit zu "undefined" Zeichenfolge - auf diese Weise erhalten Sie keine Ausnahme, wenn "bar" kann t ausgewertet werden. Aber, wenn Ihr Ausdruck nicht "undefiniert" ist, können Sie dann seinen Wert mit dem Vergleich "bar === null" überprüfen. So haben wir beide Fälle abgedeckt und wir erhalten keine Ausnahmen. –

1

Der andere Ansatz besteht darin, die Anzahl der empfangenen Argumente zu betrachten und den Wert default auf diese Weise festzulegen.

function foo(bar){ 
    if (arguments.length === 0) { 
     return -1; 
    } 
    return bar; 
} 
Verwandte Themen