Vraag Hoe kan ik een string naar boolean in JavaScript converteren?


Kan ik een tekenreeks die een booleaanse waarde vertegenwoordigt (bijvoorbeeld 'waar', 'onwaar') naar een intrinsiek type in JavaScript converteren?

Ik heb een verborgen formulier in HTML dat wordt bijgewerkt op basis van de selectie van een gebruiker in een lijst. Dit formulier bevat enkele velden die Booleaanse waarden vertegenwoordigen en dynamisch worden gevuld met een intrinsieke Booleaanse waarde. Zodra deze waarde echter in het verborgen invoerveld wordt geplaatst, wordt het een tekenreeks.

De enige manier die ik kon vinden om de Booleaanse waarde van het veld te bepalen, nadat deze in een tekenreeks was omgezet, was afhankelijk van de letterlijke waarde van de tekenreeksrepresentatie.

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';

Is er een betere manier om dit te bereiken?


1832
2017-11-05 00:13


oorsprong


antwoorden:


Do:

var isTrueSet = (myValue == 'true');

Je zou het strenger kunnen maken door de identiteitsoperator te gebruiken (===), die geen conversies van het impliciete type uitvoert wanneer de vergeleken variabelen verschillende typen hebben, in plaats van de gelijkheidsoperator (==).

var isTrueSet = (myValue === 'true');

Niet doen:

Dat zou je waarschijnlijk wel moeten doen wees voorzichtig met het gebruik van deze twee methoden voor uw specifieke behoeften:

var myBool = Boolean("false");  // == true

var myBool = !!"false";  // == true

Elke string die niet de lege string is, evalueert naar true door ze te gebruiken. Hoewel ze de schoonste methoden zijn die ik kan bedenken voor booleaanse conversie, denk ik dat ze niet zijn wat je zoekt.


2460



Waarschuwing

Dit hoogst up-reviewed oude antwoord is technisch correct, maar dekt slechts een zeer specifiek scenario, wanneer uw tekenreekswaarde PRECIES is "true" of "false" (MOET ook in kleine letters zijn).

Er is een ongeldige json-reeks doorgegeven aan deze functies hieronder ZAL een uitzondering werpen.


Origineel antwoord:

Wat dacht je van?

JSON.parse("true");

of met jQuery

$.parseJSON("true");

516



stringToBoolean: function(string){
    switch(string.toLowerCase().trim()){
        case "true": case "yes": case "1": return true;
        case "false": case "no": case "0": case null: return false;
        default: return Boolean(string);
    }
}

186



Ik denk dat dit veel universeel is:

if (String(a) == "true") ...

Het gaat:

String(true) == "true"     //returns true
String(false) == "true"    //returns false
String("true") == "true"   //returns true
String("false") == "true"  //returns false

120



U kunt reguliere expressies gebruiken:

/*
 * Converts a string to a bool.
 *
 * This conversion will:
 *
 *  - match 'true', 'on', or '1' as true.
 *  - ignore all white-space padding
 *  - ignore capitalization (case).
 *
 * '  tRue  ','ON', and '1   ' will all evaluate as true.
 *
 */
function strToBool(s)
{
    // will match one and only one of the string 'true','1', or 'on' rerardless
    // of capitalization and regardless off surrounding white-space.
    //
    regex=/^\s*(true|1|on)\s*$/i

    return regex.test(s);
}

Als je de String-klasse wilt uitbreiden, kun je het volgende doen:

String.prototype.bool = function() {
    return strToBool(this);
};

alert("true".bool());

Voor diegenen (zie de reacties) die het String-object willen uitbreiden om dit te krijgen, maar zich zorgen maken over opsommingstekens en zich zorgen maken over botsen met andere code die het String-object verlengt:

Object.defineProperty(String.prototype, "com_example_bool", {
    get : function() {
        return (/^(true|1)$/i).test(this);
    }
});
alert("true".com_example_bool);

(Werkt uiteraard niet in oudere browsers en Firefox toont false terwijl Opera, Chrome, Safari en IE waar zijn. Bug 720760)


105



Vergeet niet om het geval te matchen:

var isTrueSet = (myValue.toLowerCase() === 'true');

Als het een formulierelement is, kunt u ook detecteren of het selectievakje is aangevinkt:

var isTrueSet = document.myForm.IS_TRUE.checked;

Ervan uitgaande dat als het is aangevinkt, het is "ingesteld" gelijk aan waar. Dit evalueert als waar / onwaar.


103



Houtoogje wees voorzichtig. Na het zien van de consequenties na het toepassen van het topantwoord met 500+ upvotes, voel ik me verplicht om iets te posten dat echt nuttig is:

Laten we beginnen met de kortste, maar zeer strikte manier:

var str = "true";
var mybool = JSON.parse(str);

En eindigen met een juiste, meer tolerante manier:

var parseBool = function(str) 
{
    // console.log(typeof str);
    // strict: JSON.parse(str)

    if(str == null)
        return false;

    if (typeof str === 'boolean')
    {
        return (str === true);
    } 

    if(typeof str === 'string')
    {
        if(str == "")
            return false;

        str = str.replace(/^\s+|\s+$/g, '');
        if(str.toLowerCase() == 'true' || str.toLowerCase() == 'yes')
            return true;

        str = str.replace(/,/g, '.');
        str = str.replace(/^\s*\-\s*/g, '-');
    }

    // var isNum = string.match(/^[0-9]+$/) != null;
    // var isNum = /^\d+$/.test(str);
    if(!isNaN(str))
        return (parseFloat(str) != 0);

    return false;
}

testen:

var array_1 = new Array(true, 1, "1",-1, "-1", " - 1", "true", "TrUe", "  true  ", "  TrUe", 1/0, "1.5", "1,5", 1.5, 5, -3, -0.1, 0.1, " - 0.1", Infinity, "Infinity", -Infinity, "-Infinity"," - Infinity", " yEs");

var array_2 = new Array(null, "", false, "false", "   false   ", " f alse", "FaLsE", 0, "00", "1/0", 0.0, "0.0", "0,0", "100a", "1 00", " 0 ", 0.0, "0.0", -0.0, "-0.0", " -1a ", "abc");


for(var i =0; i < array_1.length;++i){ console.log("array_1["+i+"] ("+array_1[i]+"): " + parseBool(array_1[i]));}

for(var i =0; i < array_2.length;++i){ console.log("array_2["+i+"] ("+array_2[i]+"): " + parseBool(array_2[i]));}

for(var i =0; i < array_1.length;++i){ console.log(parseBool(array_1[i]));}
for(var i =0; i < array_2.length;++i){ console.log(parseBool(array_2[i]));}

39



Jouw oplossing is prima.

Gebruik makend van === zou gewoon dom zijn in dit geval, zoals het veld is value zal altijd een zijn String.


29