Ich habe eine Variable, die Folgendes speichert false
o true
aber ich brauche 0
o 1
stattdessen. Wie kann ich das tun?
Interessanterweise ist das ternäre System jetzt am schnellsten in Chrome 64.0.3282 auf macOS 10.13.3.
Ich habe eine Variable, die Folgendes speichert false
o true
aber ich brauche 0
o 1
stattdessen. Wie kann ich das tun?
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;
.
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.
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;
}});
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.
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
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.
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.
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;