Puis-je convertir une chaîne représentant une valeur booléenne (par exemple, "vrai", "faux") 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 certains 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.
Le seul moyen que j'ai pu trouver pour déterminer la valeur booléenne du champ, une fois qu'il a été converti en 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';
Existe-t-il une meilleure façon d'accomplir cela?
javascript
Kevin
la source
la source
string=(string==String(string?true:false))?(string?true:false):(!string?true:false);
function parseBool(val) { return val === true || val === "true" }
function checkBool(x) { if(x) {return true;} else {return false;} }
if (checkBool(x) != false) { ... } else { ... }
!!(parseInt(value) || value === "true")
Réponses:
Faire:
Vous pouvez le rendre plus strict en utilisant l'opérateur d'identité (
===
), qui n'effectue aucune conversion de type implicite lorsque les variables comparées ont des types différents, au lieu de l'opérateur d'égalité (==
).Ne pas:
Vous devriez probablement être prudent lorsque vous utilisez ces deux méthodes pour vos besoins spécifiques:
Toute chaîne qui n'est pas la chaîne vide sera évaluée
true
en les utilisant. Bien que ce soient les méthodes les plus propres auxquelles je puisse penser en ce qui concerne la conversion booléenne, je pense que ce n'est pas ce que vous recherchez.la source
myValue === 'true';
est précisément équivalent àmyValue == 'true';
. Il n'y a aucun avantage à utiliser===
plus==
ici.===
et!==
chaque fois que cela a du sens, ce qui est presque toujours le cas.==
vs===
est l'un des rares où je ne le fais pas. Je ne suis pas du tout d' accord pour dire qu'il est «presque toujours» judicieux d'utiliser===
. Des langages mal typés existent parce que nous ne voulons pas nous soucier du type; si nous vérifions quelque chose commeif (price >= 50)
nous ne nous soucions pas si cela a commencé comme une chaîne. Je dis, la plupart du temps, nous voulons que les types soient jonglés. Dans les rares cas où nous ne voulons pas jongler avec le type (par exempleif (price === null)
), nous utilisons===
. C'est ce que je fais depuis des années et je n'ai jamais eu de problème.Attention
Cette réponse héritée très apprécié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"
.Une chaîne json non valide passée dans ces fonctions ci-dessous lèvera une exception .
Réponse originale:
Que diriez-vous?
ou avec jQuery
la source
JSON.parse("TRUE".toLowerCase())
pour qu'il puisse analyser correctement.'true'.length === 4
?typeof str==="string"
&&str.length===4
&&str.charAt(0)==="t" && str.charAt(1)==="r" && str.charAt(2)==="u" && str.charAt(3)==="e"
&&true===true && true!==false && false===false
// juste pour être sûrla source
"true"
,"yes"
et"1"
. 2)toLowerCase
ne revient pasnull
. 3)Boolean(string)
est le mêmestring!==""
qu'ici. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
false
.default: return true;
est certainement possible. Mais cela changerait le comportement de la fonction.Je pense que c'est beaucoup universel:
if (String(a) == "true")
...Ça va:
la source
String(a).toLowerCase() === 'true'
String("what about input like this that isn't a bool?") == "true"
String()
constructeur:true+'' === 'true' // true
N'oubliez pas de faire correspondre la casse:
De plus, s'il s'agit d'une case à cocher d'élément de formulaire, vous pouvez également détecter si la case est cochée:
En supposant que s'il est coché, il est "défini" égal à vrai. Ceci est évalué comme vrai / faux.
la source
myValue
se trouvenull
,true
ou un autre type ...Vous pouvez utiliser des expressions régulières:
Si vous aimez étendre la classe String, vous pouvez faire:
Pour ceux (voir les commentaires) qui souhaitent étendre l'objet String pour l'obtenir, mais s'inquiètent de l'énumération et craignent de se heurter à un autre code qui étend l'objet String:
(Ne fonctionnera pas dans les anciens navigateurs bien sûr et Firefox affiche faux alors qu'Opera, Chrome, Safari et IE sont vrais. Bogue 720760 )
la source
Object.defineProperty
.parseBool
Wood-eye, soyez prudent. Après avoir vu les conséquences après avoir appliqué la première réponse avec plus de 500 votes positifs, je me sens obligé de publier quelque chose qui est réellement utile:
Commençons par le moyen le plus court mais le plus strict:
Et terminez d'une manière appropriée et plus tolérante:
Essai:
la source
false
valeur booléenne avecJSON.parse
? En termes de CPU, de performances mémoireJ'ai pensé que la réponse de @Steven était la meilleure et j'ai pris en charge beaucoup plus de cas que si la valeur entrante n'était qu'une chaîne. Je voulais l'étendre un peu et offrir ce qui suit:
Il n'est pas nécessaire de couvrir tous les
false
cas si vous connaissez déjà tous lestrue
cas dont vous auriez à rendre compte. Vous pouvez passer n'importe quoi dans cette méthode qui pourrait passer pour unetrue
valeur (ou en ajouter d'autres, c'est assez simple), et tout le reste serait considéréfalse
la source
autocomplete="on"
Solution universelle avec analyse JSON:
MISE À JOUR (sans JSON):
J'ai aussi créé du violon pour le tester http://jsfiddle.net/remunda/2GRhG/
la source
getBool(undefined)
plantera lors de l'utilisation de la version JSON d'origine et retournera vrai pour la 2ème version. Voici une 3ème version qui retourne false: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). replace (!! 0, '')); }Votre solution est très bien.
L'utilisation
===
serait juste idiote dans ce cas, car le champvalue
sera toujours aString
.la source
===
? En termes de performances, ce serait exactement la même chose si les deux types sont des chaînes. Quoi qu'il en soit, je préfère utiliser===
car j'évite toujours l'utilisation de==
et!=
. Justifications: stackoverflow.com/questions/359494/…value
sera toujours unstring
ni==
ni===
stupide. Les deux sont le bon outil pour ce travail. Ils ne diffèrent que lorsque les types ne sont pas égaux. Dans ce cas,===
renvoie simplementfalse
while==
exécute un algorithme de coercition de type complexe avant la comparaison.Ce rendement
false
pour chaque valeur falsy ettrue
pour chaque valeur de truthy sauf pour'false'
,'f'
,'no'
,'n'
et'0'
(insensible à la casse).la source
L'objet booléen n'a pas de méthode 'parse'.
Boolean('false')
renvoie vrai, donc cela ne fonctionnera pas.!!'false'
revient égalementtrue
, de sorte que cela ne fonctionnera pas également.Si vous souhaitez que chaîne
'true'
renvoie un booléentrue
et chaîne'false'
pour renvoyer un booléenfalse
, la solution la plus simple consiste à utilisereval()
.eval('true')
renvoie vrai eteval('false')
renvoie faux. Gardez à l'esprit les implications en termes de performances lors de l'utilisationeval()
.la source
var isTrueSet = (myValue === 'true');
c'est la meilleure réponse.eval('TRUE')
; prouvant une fois de plus, c'esteval()
mal.JSON.parse('TRUE')
de la réponse ci-dessous échoue également de manière spectaculaire. Il est assez facile de forcer une condition d'erreur en JavaScript (ou dans n'importe quelle langue, d'ailleurs). Pour tenir compte de cela, vous devez d'abord normaliser la chaîne, par exemple,var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
.toLowerCase()
dans la réponse est mon point. Je n'essaye pas de forcer quoi que ce soit. Les majusculesTRUE
sont une valeur suffisamment courante pour être renvoyée par de nombreux widgets d'interface utilisateur.Cela a été tiré de la réponse acceptée, mais en réalité, il a un point très faible, et je suis choqué de voir comment il a obtenu ce nombre de votes positifs, le problème avec cela, c'est que vous devez considérer le cas de la chaîne car il est sensible à la casse
la source
J'utilise ce qui suit:
Cette fonction effectue la contrainte booléenne habituelle à l'exception des chaînes "false" (insensible à la casse) et "0".
la source
Il y a beaucoup de réponses et il est difficile d'en choisir une. Dans mon cas, je priorise les performances lors du choix, donc je crée ce jsPerf qui, je l'espère, pourra apporter un peu de lumière ici.
Bref des résultats (le plus haut sera le mieux):
Ils sont liés à la réponse correspondante où vous pouvez trouver plus d'informations (avantages et inconvénients) sur chacun d'eux; spécialement dans les commentaires.
la source
la source
function parseBoolean
placeL'expression que vous recherchez est simplement
un péché
Cela teste
myValue
une expression régulière, insensible à la casse et ne modifie pas le prototype.Exemples:
la source
Pour convertir à la fois une chaîne ("vrai", "faux") et un booléen en booléen
Où
flag
peut êtrela source
Il y a déjà tellement de réponses disponibles. Mais ce qui suit peut être utile dans certains scénarios.
Cela peut être utile lorsqu'un exemple avec des valeurs non booléennes.
la source
pourquoi n'essayez-vous pas quelque chose comme ça
Il retournera une erreur lorsqu'un autre texte est donné plutôt que vrai ou faux quel que soit le cas et il capturera également les nombres comme
la source
Cette fonction peut gérer les chaînes ainsi que les valeurs booléennes true / false.
Démonstration ci-dessous:
la source
J'utilise celui-ci
la source
"true"
outrue
. Si vient le second, cela ne fonctionnera pas. Est-il possible de faire undocument.prototype
pour l'utiliser où nous le voulons?De loin, le moyen le plus simple (en supposant que votre chaîne soit «vraie» ou «fausse») est:
Utilisez toujours l'opérateur === au lieu de l'opérateur == pour ces types de conversions!
source
Comme l'a dit @ Shadow2531, vous ne pouvez pas simplement le convertir directement. Je suggérerais également que vous considériez les entrées de chaîne en plus de "vrai" et "faux" qui sont "véridiques" et "falsey" si votre code va être réutilisé / utilisé par d'autres. Voici ce que j'utilise:
source
Vous devez séparer (dans votre réflexion) la valeur de vos sélections et la représentation de cette valeur.
Choisissez un point dans la logique JavaScript où ils doivent passer des sentinelles de chaîne au type natif et faites une comparaison là-bas, de préférence où cela n'est fait qu'une seule fois pour chaque valeur à convertir. N'oubliez pas de répondre à ce qui doit se produire si la chaîne sentinelle n'est pas celle que le script connaît (c.-à-d. Est-ce que vous par défaut est vrai ou faux?)
En d'autres termes, oui, vous devez dépendre de la valeur de la chaîne. :-)
source
Mon point de vue sur cette question est qu'elle vise à satisfaire trois objectifs:
Le problème avec l'utilisation de JSON est qu'il échoue en provoquant une erreur Javascript. Cette solution n'est pas résiliente (bien qu'elle satisfasse 1 et 3):
Cette solution n'est pas assez concise:
Je travaille sur la résolution de ce problème exact pour Typecast.js . Et la meilleure solution à ces trois objectifs est celle-ci:
Il fonctionne dans de nombreux cas, n'échoue pas lorsque des valeurs comme {} sont transmises et est très concis. De plus, il retourne false comme valeur par défaut plutôt que non défini ou lançant une erreur, ce qui est plus utile dans le développement Javascript de type lâche. Bravo aux autres réponses qui l'ont suggéré!
'true'
, mais pas pour une entrée véridique. Afin de le rendre conforme à l'objectif n ° 1, il n'est que légèrement plus concis que la solution n ° 2 et beaucoup moins lisible.return /^(true|yes|1|t|y)$/i.test(str);
Je suis un peu en retard, mais j'ai un petit extrait pour ce faire, il maintient essentiellement tous JScripts truthey / Falsey / sale ness mais comprend
"false"
comme une valeur acceptible pour faux.Je préfère cette méthode à celles mentionnées car elle ne repose pas sur un tiers pour analyser le code (ie: eval / JSON.parse), ce qui est exagéré dans mon esprit, il est assez court pour ne pas nécessiter de fonction utilitaire et maintient autres conventions Truthey / Falsey.
la source
une autre solution. jsFiddle
cas de test exécutés dans le nœud
la source
Dieu sacré, certaines de ces réponses sont tout simplement sauvages. J'adore JS et son nombre infini de façons d'écorcher un bool.
Ma préférence, que j'ai été choquée de ne pas voir déjà, est:
la source
Bon mot
Nous avons juste besoin de prendre en compte la "fausse" chaîne puisque toute autre chaîne (y compris "vraie") l'est déjà
true
.Tester
Une version plus exaustive
Tester
la source