440 Stimmen

Boolesches Ergebnis in Zahl/Ganzzahl umwandeln

Ich habe eine Variable, die Folgendes speichert false o true aber ich brauche 0 o 1 stattdessen. Wie kann ich das tun?

9 Stimmen

Hier ist ein Leistungsvergleich einiger der angebotenen Techniken: jsperf.com/umwandlung-von-boolean-zu-zahl .

6 Stimmen

Node.JS werden die Nutzer verwenden wollen bool === true ? 1 : 0 da er bei weitem der schnellste V8 ist.

6 Stimmen

Oder einfach bool ? 1 : 0;

52voto

Gal Talmor Punkte 964

Ich habe eine JSperf Vergleich aller vorgeschlagenen Antworten.

TL;DR - die beste Option für alle aktuellen Browser ist:

val | 0;

.

Aktualisierung:

Heutzutage scheinen sie alle ziemlich identisch zu sein, mit der Ausnahme, dass die Number() Funktion ist die langsamste, während die beste Funktion val === true ? 1 : 0; .

2 Stimmen

Interessanterweise ist das ternäre System jetzt am schnellsten in Chrome 64.0.3282 auf macOS 10.13.3.

1 Stimmen

Das wäre zu diesem Zeitpunkt die schnellste Option. Das bedeutet aber nicht, dass es die beste Option wäre.

35voto

tonyjcamp Punkte 367

Ich bin erst heute auf diese Abkürzung gestoßen.

~~(true)

~~(false)

Menschen, die viel klüger sind als ich, können das erklären:

http://james.padolsey.com/javascript/double-bitwise-not/

4 Stimmen

Interessant. Ich habe heute etwas Neues gelernt. Ich werde diese Technik allerdings in keinem Projekt anwenden, weil sie mich oder meine zukünftigen Kollegen verwirren könnte.

2 Stimmen

Hacky js ist mein Favorit. ernsthaft, +1

21voto

Charlie Lynch Punkte 373

Wenn JavaScript einen Zahlenwert erwartet, aber stattdessen einen booleschen Wert erhält, wandelt es diesen in eine Zahl um: true und false werden in 1 bzw. 0 umgewandelt. Das können Sie sich also zunutze machen;

var t = true;
var f = false;

console.log(t*1); // t*1 === 1
console.log(f*1); // f*1 === 0 

console.log(+t); // 0+t === 1 or shortened to +t === 1
console.log(+f); //0+f === 0 or shortened to +f === 0

Weitere Lektüre Type Conversions Kapitel 3.8 von The Definitive Guide to Javascript.

0 Stimmen

Erzeugt in einigen Fällen NaN

15voto

Nicholas R. Grant Punkte 366

Ich hatte gerade mit diesem Problem in einem Code zu tun, den ich geschrieben habe. Meine Lösung war, ein bitweises und zu verwenden.

var j = bool & 1;

Ein schnellerer Weg, um mit einem konstanten Problem umzugehen, wäre, eine Funktion zu erstellen. Sie ist für andere besser lesbar, in der Wartungsphase besser zu verstehen und verhindert, dass man etwas Falsches schreiben kann.

function toInt( val ) {
    return val & 1;
}

var j = toInt(bool);

Bearbeiten - 10. September 2014

Keine Konvertierung mit einem ternären Operator mit dem identischen Operator to ist in Chrome aus irgendeinem Grund schneller. Macht keinen Sinn, warum es schneller ist, aber ich nehme an, es ist eine Art von Low-Level-Optimierung, die irgendwo auf dem Weg Sinn macht.

var j = boolValue === true ? 1 : 0;

Testen Sie selbst: http://jsperf.com/boolean-int-conversion/2

In FireFox und Internet Explorer ist die von mir eingestellte Version im Allgemeinen schneller.

Bearbeiten - 14. Juli 2017

Okay, ich werde Ihnen nicht sagen, welche Sie verwenden sollten und welche nicht. Jeder verdammte Browser hat sich in der Geschwindigkeit, mit der sie die Operation mit jeder Methode durchführen können, auf und ab bewegt. Bei Chrome war die bitweise &-Version einmal sogar besser als die anderen, aber dann war sie plötzlich viel schlechter. Ich weiß nicht, was sie tun, also lasse ich es einfach bei "who cares". Es gibt selten einen Grund, sich darüber Gedanken zu machen, wie schnell eine solche Operation durchgeführt wird. Sogar auf dem Handy ist es eine Nulloperation.

Außerdem gibt es eine neuere Methode zum Hinzufügen eines 'toInt'-Prototyps, der nicht überschrieben werden kann.

Object.defineProperty(Boolean.prototype, "toInt", { value: function()
{
    return this & 1;
}});

0 Stimmen

Ich habe zwei Ablehnungen für diesen Beitrag erhalten. Warum erklären Sie nicht, warum Sie ihn herabgestuft haben? Sonst ist es nur eine Herabstufung ohne Begründung.

1 Stimmen

In 99 Fällen führen die Ergebnisse von jsperf nur zu einer vorzeitigen Optimierung, bei der Nanosekunden einer Schleife optimiert werden, während man sich stattdessen auf die hässliche SQL-Anweisung konzentrieren sollte. danke für die Bereitstellung einiger verschiedener Möglichkeiten, dies anzugehen

0 Stimmen

Welche SQL-Anweisung? Es gibt hier nicht eine einzige Abfrage. Wenn du dich auf JSPerf beziehst, habe ich das aus dem Test von jemand anderem verlinkt. Es ist nicht mein eigener. Der Performance-Aspekt ist mir ehrlich gesagt egal, da es sich um einen reinen Vorgang handelt. Ich habe meine eigene Sprache, die fast Funktionalität identisch mit JS war erstellt und ich erinnere mich, dass Casting zu int war eine dumme schnelle Operation. Das Erklimmen von Prototypenketten war es nicht. Deshalb würde ich immer noch den ersten Weg empfehlen, wie ich es gemacht habe, mit einer einfachen Funktion, die vom Compiler eingefügt werden kann.

14voto

Gustav Barkefors Punkte 4826

Der unäre + Der Betreiber wird sich darum kümmern:

var test = true;
// +test === 1
test = false;
// +test === 0

Sie werden natürlich wollen, um diese Sanity-Check auf dem Server vor dem Speichern, so dass eine vernünftige Ort, um dies zu tun, obwohl, könnte sein.

0 Stimmen

Ich habe die Kommentare geändert in === denn true == 1 ist auch ohne die "explizite Umrechnung" wahr :-) true === 1 ist stattdessen falsch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X