Convertir le résultat booléen dans nombre de/nombre entier
J'ai une variable qui stocke false
ou true
, mais j'ai besoin de 0
ou 1
au lieu de cela, respectivement. Comment puis-je faire cela?
- Voici une comparaison des performances de certains de ses techniques: jsperf.com/conversion-from-boolean-to-number.
- Node.JS les utilisateurs souhaitent utiliser
bool === true ? 1 : 0
, comme il est de loin le plus rapide en V8. - ou tout simplement
bool ? 1 : 0;
Vous devez vous connecter pour publier un commentaire.
Javascript est un opérateur ternaire, vous pouvez utiliser:
NaN
. Donc, si vous voulez 3LL3 et la garantie de l'entrée, allez urary, sinon il me semble que le ternaire + truthy test est le meilleur.Utiliser le unaire
+
de l'opérateur, qui convertit son opérande dans un certain nombre.Note, bien sûr, que vous devriez toujours nettoyer les données sur le côté serveur, car un utilisateur peut envoyer des données à votre serveur, n'importe ce que le code côté client dit.
Number()
est encore plus lente.bool === true ? 1 : 0
est le plus rapide, avec une seconde près debool | 0
.function timeit(a, b, c, d) {c = performance.now(); for(d = 0; d < b; d++) a(); return performance.now()-c}
. Passer de la fonction et le nombre de boucles.À mon humble avis, la meilleure solution est:
Il est utilisé dans les asm.js à force de type entier.
fooBar & 1
.1
nombre entier si fooBar n'est pas?Je préfère utiliser le Numéro de la fonction. Il prend un objet et le convertit en un nombre.
Exemple:
Ou de l'exécuter dans jsFiddle.
J'ai créé un JSperf comparaison de toutes les réponses suggérées.
TL;DR - la meilleure option pour tous les navigateurs actuels est:
.
Mise à jour:
Il semble que ces jours, ils sont tous assez identiques, sauf que la
Number()
de la fonction est le plus lent, tandis que le mieux étantval === true ? 1 : 0;
.Tapé la façon de le faire serait:
Je viens de tomber sur ce raccourci aujourd'hui.
~~(vrai)
~~(faux)
Des gens beaucoup plus intelligents que ce que je peux expliquer:
http://james.padolsey.com/javascript/double-bitwise-not/
Quand le JavaScript s'attend à un nombre de valeur, mais reçoit un booléen plutôt elle qui convertit booléen dans un certain nombre: le vrai et le faux convertir en 1 et 0 respectivement. De sorte que vous pouvez prendre avantage de cela;
JS:
Lecture des Conversions de Type Chapitre 3.8 de The Definitive Guide to Javascript.
Je viens de régler cette question dans la partie du code que j'écrivais. Ma solution a été d'utiliser un bit à bit et.
Un moyen plus rapide pour traiter un problème constant serait de créer une fonction. C'est plus lisible par d'autres personnes, mieux pour la compréhension lors de la phase d'entretien, et de se débarrasser de il est possible d'écrire quelque chose de mal.
Édition - septembre 10th, 2014
Pas de conversion à l'aide d'un opérateur ternaire à l'identique de l'opérateur est plus rapide en Chrome pour une raison quelconque. N'a pas de sens pour expliquer pourquoi il est plus rapide, mais je suppose que c'est une sorte de bas niveau de l'optimisation qui a du sens, quelque part le long du chemin.
Test pour vous-même: http://jsperf.com/boolean-int-conversion/2
Dans FireFox et Internet Explorer, à l'aide de la version que j'ai posté est plus rapide en général.
Édition - 14 juillet 2017
Bon, je ne vais pas vous dire que vous devriez ou ne devriez pas les utiliser. Chaque flipper navigateur a été de monter et descendre dans comment rapide ils peuvent faire l'opération avec chaque méthode. Chrome à un point réellement eu le bit-à-bit & version faire mieux que les autres, mais tout à coup, était bien pire. Je ne sais pas ce qu'ils font, donc je vais juste le laisser à qui s'en soucie. Il y a rarement une raison pour se soucier de la façon rapide d'une opération de ce genre est fait. Même sur mobile c'est un rien de fonctionnement.
Aussi, voici une nouvelle méthode pour l'ajout d'un "toInt' prototype qui ne peuvent être remplacés.
Unaire
+
opérateur prendra soin de cela:Vous souhaiterez tout naturellement à la santé mentale-le vérifier sur le serveur avant de les stocker, de sorte que peut-être un plus raisonnable pour ce faire, de toute façon, si.
===
, parce quetrue == 1
est vrai même sans la "conversion explicite 🙂true === 1
au lieu de cela est faux.Vous pouvez également ajouter 0, l'utilisation d'opérateurs de décalage ou xor:
Ces ont les mêmes débits que ceux des autres réponses.
Vous pouvez le faire par une simple extension de la boolean prototype
Il n'est pas trop facile de comprendre ce qui se passe il y a donc une version alternative serait
avoir fait ce que vous pouvez faire des trucs comme
Quand j'ai utiliser des booléens pour stocker des conditions souvent, je les convertir en bitfields auquel cas j'ai fini par utiliser une version étendue de la fonction prototype
avec lequel vous pouvez faire
qui produit 4 comme sa sortie.
J'ai testé tous ces exemples, j'ai fait un test, et enfin je vous recommande de choisir la plus courte, il n'affecte pas les performances.
Résultat
essayer
JS: