J'ai une variable qui stocke false
ou true
, mais j'ai besoin de 0
ou à la 1
place, respectivement. Comment puis-je faire ceci?
276
J'ai une variable qui stocke false
ou true
, mais j'ai besoin de 0
ou à la 1
place, respectivement. Comment puis-je faire ceci?
bool === true ? 1 : 0
, car il est de loin le plus rapide du V8.bool ? 1 : 0;
Réponses:
Javascript a un opérateur ternaire que vous pouvez utiliser:
la source
NaN
. Donc, si vous voulez L33T et garantissez l'entrée, allez uraire, sinon il me semble que le test ternaire + véridique est le meilleur.Utilisez l' opérateur unaire
+
, qui convertit son opérande en nombre.Notez, bien sûr, que vous devez toujours nettoyer les données côté serveur, car un utilisateur peut envoyer des données à votre serveur, quel que soit le code côté client.
la source
Number()
est encore plus lent.bool === true ? 1 : 0
être le plus rapide, avec une seconde de prèsbool | 0
.À mon humble avis, la meilleure solution est:
Ceci est utilisé dans asm.js pour forcer le type entier.
la source
1
entier si fooBar ne l'est pas?Je préfère utiliser la fonction Number . Il prend un objet et le convertit en nombre.
Exemple:
Vous pouvez le tester dans un jsFiddle .
la source
J'ai créé une comparaison JSperf de toutes les réponses suggérées.
TL; DR - la meilleure option pour tous les navigateurs actuels est:
.
Mettre à jour:
Il semble que ces jours-ci, ils sont tous assez identiques, sauf que la
Number()
fonction est la plus lente, tout en étant la meilleureval === true ? 1 : 0;
.la source
La manière typée de le faire serait:
la source
Je viens de tomber sur ce raccourci aujourd'hui.
~~ (vrai)
~~ (faux)
Des gens beaucoup plus intelligents que je ne peux l'expliquer:
http://james.padolsey.com/javascript/double-bitwise-not/
la source
Lorsque JavaScript attend une valeur numérique mais reçoit un booléen à la place, il convertit ce booléen en nombre: true et false convertissent respectivement en 1 et 0. Vous pouvez donc en profiter;
Lectures complémentaires Conversions de types Chapitre 3.8 du guide définitif de Javascript.
la source
L'
+
opérateur unaire s'en charge:Vous voudrez naturellement vérifier cela sur le serveur avant de le stocker, de sorte que cela pourrait être un endroit plus judicieux de toute façon.
la source
===
, cartrue == 1
c'est vrai même sans la "conversion explicite :-) à latrue === 1
place est fausse.Je faisais juste face à ce problème dans un code que j'écrivais. Ma solution était d'utiliser un bitwise et.
Un moyen plus rapide de traiter un problème constant serait de créer une fonction. Il est plus lisible par d'autres personnes, mieux à comprendre au stade de la maintenance et élimine le potentiel d'écriture de quelque chose de mal.
Edit - 10 septembre 2014
Aucune conversion utilisant un opérateur ternaire avec l'opérateur identique à n'est plus rapide dans Chrome pour une raison quelconque. Cela n'a aucun sens pourquoi il est plus rapide, mais je suppose que c'est une sorte d'optimisation de bas niveau qui a du sens quelque part en cours de route.
Testez par vous-même: http://jsperf.com/boolean-int-conversion/2
Dans FireFox et Internet Explorer, l'utilisation de la version que j'ai publiée est généralement plus rapide.
Edit - 14 juillet 2017
D'accord, je ne vais pas vous dire lequel vous devez ou ne devez pas utiliser. Chaque navigateur flippant montait et descendait à quelle vitesse ils pouvaient faire l'opération avec chaque méthode. Chrome à un moment donné avait en fait la version au niveau du bit et mieux que les autres, mais c'était soudain bien pire. Je ne sais pas ce qu'ils font, donc je vais juste laisser à qui s'en soucie. Il n'y a rarement aucune raison de se soucier de la vitesse à laquelle une telle opération est effectuée. Même sur mobile, ce n'est rien.
En outre, voici une nouvelle méthode pour ajouter un prototype «toInt» qui ne peut pas être écrasé.
la source
Vous pouvez également ajouter 0, utiliser des opérateurs de décalage ou xor:
Ceux-ci ont des vitesses similaires à celles des autres réponses.
la source
Dans mon contexte, React Native où je reçois la valeur d'opacité du booléen, la manière la plus simple: Utilisez l'opérateur unaire +.
Cela convertit le booléen en nombre;
la source
Vous pouvez le faire en étendant simplement le prototype booléen
Il n'est pas trop facile de comprendre ce qui se passe là-bas, donc une autre version serait
ayant fait ce que vous pouvez faire des choses comme
Lorsque j'utilise des booléens pour stocker des conditions, je les convertis souvent en champs de bits, auquel cas je finis par utiliser une version étendue de la fonction prototype
avec lequel vous pouvez faire
qui produit 4 comme sortie.
la source
la source
essayer
Afficher l'extrait de code
la source
J'ai testé tous ces exemples, j'ai fait un benchmark, et enfin je vous recommande de choisir le plus court, cela n'affecte pas les performances.
Résultat
la source
si vous voulez changer la valeur x entière si 1 à 0 et si 0 à 1 vous pouvez utiliser (x + 1)% 2
la source