Question Comment puis-je convertir une chaîne en booléen en JavaScript?


Puis-je convertir une chaîne représentant une valeur booléenne (par exemple, 'true', 'false') en un type intrinsèque en JavaScript?

J'ai un formulaire caché en HTML qui est mis à jour en fonction de la sélection d'un utilisateur dans une liste. Ce formulaire contient des champs qui représentent des valeurs booléennes et sont remplis dynamiquement avec une valeur booléenne intrinsèque. Cependant, une fois que cette valeur est placée dans le champ de saisie masqué, elle devient une chaîne.

La seule façon que je pouvais trouver pour déterminer la valeur booléenne du champ, une fois qu'il était converti en une chaîne, était de dépendre de la valeur littérale de sa représentation sous forme de chaîne.

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

Y a-t-il une meilleure façon d'accomplir cela?


1832
2017-11-05 00:13


origine


Réponses:


Faire:

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

Vous pouvez le rendre plus strict en utilisant l'opérateur d'identité (===), qui ne fait aucune conversion de type implicite lorsque les variables comparées ont des types différents, au lieu de l'opérateur d'égalité (==).

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

Ne pas:

Tu devrais probablement soyez prudent sur l'utilisation de ces deux méthodes pour vos besoins spécifiques:

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

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

Toute chaîne qui n'est pas la chaîne vide sera évaluée à true en les utilisant. Bien qu'ils soient les méthodes les plus propres que je puisse penser concernant la conversion booléenne, je pense qu'ils ne sont pas ce que vous cherchez.


2460



Attention

Cette réponse héritage héritée est techniquement correcte mais ne couvre qu'un scénario très spécifique, lorsque la valeur de votre chaîne est EXACTEMENT "true" ou "false" (DOIT être en minuscule aussi bien).

Une chaîne json invalide passée dans ces fonctions ci-dessous Jettera une exception.


Réponse originale:

Que diriez-vous?

JSON.parse("true");

ou avec 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



Je pense que c'est très universel:

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

Ça va:

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

120



Vous pouvez utiliser des expressions régulières:

/*
 * 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);
}

Si vous aimez étendre la classe String, vous pouvez faire:

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

alert("true".bool());

Pour ceux (voir les commentaires) qui souhaiteraient étendre l'objet String pour l'obtenir, mais qui s'inquiètent de l'énumérabilité et qui craignent d'entrer en conflit avec un autre code qui étend l'objet String:

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

(Ne fonctionnera pas dans les anciens navigateurs bien sûr et Firefox montre faux alors que Opera, Chrome, Safari et IE montrent vrai. Bogue 720760)


105



N'oubliez pas de faire correspondre le cas:

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

De même, si c'est une case à cocher d'un élément de formulaire, vous pouvez également détecter si la case est cochée:

var isTrueSet = document.myForm.IS_TRUE.checked;

En supposant que si elle est cochée, elle est "définie" égale à true. Cela évalue comme vrai / faux.


103



Wood-eye soyez prudent. Après avoir vu les conséquences après avoir appliqué la meilleure réponse avec plus de 500 upvotes, je me sens obligé de poster quelque chose qui est réellement utile:

Commençons par le plus court, mais très strict:

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

Et finir avec une manière correcte et plus tolérante:

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;
}

Essai:

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



Votre solution est correcte.

En utilisant === serait juste stupide dans ce cas, comme le champ de value sera toujours un String.


29



Solution universelle avec analyse JSON:

function getBool(val) {
    return !!JSON.parse(String(val).toLowerCase());
}

getBool("1"); //true
getBool("0"); //false
getBool("true"); //true
getBool("false"); //false
getBool("TRUE"); //true
getBool("FALSE"); //false

UPDATE (sans JSON):

function getBool(val){ 
    var num = +val;
    return !isNaN(num) ? !!num : !!String(val).toLowerCase().replace(!!0,'');
}

J'ai aussi créé du violon pour le tester http://jsfiddle.net/remunda/2GRhG/


24



Je pensais que la réponse de @Steven était la meilleure, et prenait soin de beaucoup plus de cas que si la valeur entrante était juste une chaîne. Je voulais prolonger un peu et offrir ce qui suit:

function isTrue(value){
    if (typeof(value) === 'string'){
        value = value.trim().toLowerCase();
    }
    switch(value){
        case true:
        case "true":
        case 1:
        case "1":
        case "on":
        case "yes":
            return true;
        default: 
            return false;
    }
}

Il n'est pas nécessaire de couvrir tous les false cas si vous connaissez déjà tous les true les cas que vous auriez à rendre compte. Vous pouvez passer n'importe quoi dans cette méthode qui pourrait passer pour un true valeur (ou ajouter d'autres, c'est assez simple), et tout le reste serait considéré false


22