Der schnellste sichere Weg, eine Zeichenkette in einer Zeile Code in einen Booleschen Wert umzuwandeln
Eine der Funktionen, die helfen, die Codeausführung in Javascript zu beschleunigen, ist Kurzschluss-Auswertung :
Da logische Ausdrücke von links nach rechts ausgewertet werden, werden sie anhand der folgenden Regeln auf eine mögliche "Kurzschluss"-Auswertung geprüft:
- false && (irgendetwas) wird als Kurzschluss zu false ausgewertet.
- true || (irgendetwas) wird in einem Kurzschluss als true ausgewertet.
Wenn Sie also einen Zeichenkettenwert daraufhin testen wollen, ob er true
de false
en JSON.parse
zu testen und die Leistung aufrechtzuerhalten, können Sie die ||
Operator, um den langsamen Code von der Ausführung auszuschließen, wenn der Testwert vom Typ Boolean ist.
test === true || ['true','yes','1'].indexOf(test.toString().toLowerCase()) > -1
Da die Array.prototype.indexOf()
Methode ist ein Teil von ECMA-262 Standard in der 5. Auflage, benötigen Sie möglicherweise eine Polyfill für die Unterstützung der alten Browser.
// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(searchElement, fromIndex) {
var k;
// 1. Let O be the result of calling ToObject passing
// the this value as the argument.
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
var O = Object(this);
// 2. Let lenValue be the result of calling the Get
// internal method of O with the argument "length".
// 3. Let len be ToUint32(lenValue).
var len = O.length >>> 0;
// 4. If len is 0, return -1.
if (len === 0) {
return -1;
}
// 5. If argument fromIndex was passed let n be
// ToInteger(fromIndex); else let n be 0.
var n = +fromIndex || 0;
if (Math.abs(n) === Infinity) {
n = 0;
}
// 6. If n >= len, return -1.
if (n >= len) {
return -1;
}
// 7. If n >= 0, then Let k be n.
// 8. Else, n<0, Let k be len - abs(n).
// If k is less than 0, then let k be 0.
k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
// 9. Repeat, while k < len
while (k < len) {
// a. Let Pk be ToString(k).
// This is implicit for LHS operands of the in operator
// b. Let kPresent be the result of calling the
// HasProperty internal method of O with argument Pk.
// This step can be combined with c
// c. If kPresent is true, then
// i. Let elementK be the result of calling the Get
// internal method of O with the argument ToString(k).
// ii. Let same be the result of applying the
// Strict Equality Comparison Algorithm to
// searchElement and elementK.
// iii. If same is true, return k.
if (k in O && O[k] === searchElement) {
return k;
}
k++;
}
return -1;
};
}
0 Stimmen
Nur um ein seltsames Beispiel für die Vermeidung eines Dreifach-Gleichheits-Vergleichs hervorzuheben: Ich habe eine Funktion
currentSortDirection()
die zurückgibt1
für eine aufsteigende Sortierung,0
für eine absteigende Sortierung, und-1
für nicht gesetzt. Verwendung vonwhile (currentSortDirection() != desiredSortDirection) { sortColumn() }
funktioniert hervorragend, da-1 != true
y-1 != false
...aber dies zu ändern inwhile (Boolean(currentSortDirection) !== ...) {...}
Kräfte-1
in einetrue
was ein paar zusätzliche Zeilen an Vorbereitung erfordert, nur um jshint glücklich zu machen.0 Stimmen
Mögliches Duplikat von stackoverflow.com/questions/263965
0 Stimmen
@Droogans: Was passiert, wenn
desiredSortDirection
wird eingestellt aufasc
? Ich weiß, dass Sie in einer kontrollierten Umgebung wahrscheinlich die Kontrolle über den Wert haben.desiredSortDirection
auf aber in einer gemeinsamen Umgebung gesetzt wird, wenn die Eingabe vondesiredSortDirection
kann von überall und in jeder Form kommen, Typüberprüfung gegen benutzerdefinierte Objekte und defensive Programmierung kann viele Stunden der Fehlersuche sparen. Ihr Code ist absolut in Ordnung und es ist nichts daran auszusetzen. Ich weise lediglich darauf hin, dass es keine allgemeingültige Antwort/Lösung gibt und es immer vom Szenario abhängt.107 Stimmen
"Gibt es einen besseren Weg, dies zu erreichen?" - Es gibt sicherlich einen schlechteren Weg :D
string=(string==String(string?true:false))?(string?true:false):(!string?true:false);
14 Stimmen
Einfacher Umgang mit Strings und Bools:
function parseBool(val) { return val === true || val === "true" }
0 Stimmen
Artikel mit guter Erklärung coding-issues.com/2015/11/
3 Stimmen
@Mark
function checkBool(x) { if(x) {return true;} else {return false;} }
4 Stimmen
@Sebi: Du hast vergessen, es zu dokumentieren:
if (checkBool(x) != false) { ... } else { ... }
9 Stimmen
!!(parseInt(value) || value === "true")
0 Stimmen
Das können Sie nicht, das ist unmöglich!
0 Stimmen
Nur eine Anmerkung. Ich bin immer wieder erstaunt über Javascript Ausdruck Parsing Regelsatz, zum Beispiel,
123+44+'2'+1
gibt"16721"
. Jedes + nach '2' wird als Verkettungsoperation interpretiert, wow :-D. PHP hingegen gibt 170 als Antwort, was transparenter ist, denn in PHP ist Plus nicht mehrdeutig - es wird nur für arithmetische Operationen verwendet. Verkettungsoperationen werden mit verschiedenen Operatoren durchgeführt0 Stimmen
Ich habe keine Antwort gefunden, die die Kombination undefined+string richtig löst. Also habe ich schließlich einen Einzeiler für diese Aufgabe geschrieben:
const StrToBool = (value) => !!value && value !== "false" && parseInt(value) !== 0;
Dieser Einzeiler führt zu folgenden Ergebnissen:StrToBool(undefined) => false, StrToBool('true') => true, StrToBool('false') => false, StrToBool('0') => false, StrToBool('Whatever') => true, StrToBool('1') => true
0 Stimmen
Warum sollten Sie das wollen?
0 Stimmen
Eine gute Lösung für diese Art von Konversionen ist die Nutzung einer Website wie converttypes.com wo Sie alle Konvertierungen für fast alle Programmiersprachen sehen können.
0 Stimmen
Eine gute Lösung für diese Art von Konvertierungen ist eine Website wie converttypes.com, auf der Sie alle Konvertierungen für fast alle Programmiersprachen sehen können.
0 Stimmen
!myVar.slice(4,5);
myVar = 'TRUE' // true
myVar = 'FALSE' // false
0 Stimmen
@AndrewLuca 's Antwort ist großartig - es behandelt undefined, null und alle anderen Typen. Sie betrachtet Zahlen, die nicht Null sind, als wahr, ebenso wie die Zeichenkette 'true'. Und das alles auf eine prägnante Weise.
0 Stimmen
toBool ={'false':false,'true':true } invertBool = {'false':true,'true':false}
kann verwendet werdentoBool[string]
0 Stimmen
JSON.parse('true') ist der einfachste Weg, um in einen booleschen Wert umzuwandeln.
1 Stimmen
3k Stimmen und 2,7 Mio. Aufrufe zu einem so einfachen Vorgang sagen alles aus, was man über die Qualität von Javascript als Sprache wissen muss.