web-dev-qa-db-fra.com

Convertir un résultat booléen en nombre / entier

J'ai une variable qui stocke false ou true, mais j'ai besoin de 0 ou 1 à la place, respectivement. Comment puis-je faire ceci?

227
hd.

Javascript a un opérateur ternaire que vous pouvez utiliser:

var i = result ? 1 : 0;
298
Andy Rose

Utilisez l'opérateur opérateur _ unaire + , qui convertit son opérande en nombre.

+ true; // 1
+ false; // 0

Notez bien sûr que vous devez toujours nettoyer les données côté serveur, car un utilisateur peut envoyer toutes les données à votre serveur, quel que soit le code indiqué par le client.

392
lonesomeday

A mon avis, la meilleure solution est:

fooBar | 0

Ceci est utilisé dans asm.js pour forcer le type entier.

97
kralyk

Je préfère utiliser le fonction Nombre . Il prend un objet et le convertit en nombre.
Exemple:

var myFalseBool = false;
var myTrueBool = true;

var myFalseInt = Number(myFalseBool);
console.log(myFalseInt == 0);

var myTrueInt = Number(myTrueBool);
console.log(myTrueInt == 1);

Ou lancez-le dans jsFiddle .

49
René

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:

val | 0;

.

Mise à jour:

Il semble que ces jours-ci, ils sont tous pratiquement identiques, sauf que la fonction Number() est la plus lente, alors que la meilleure est val === true ? 1 : 0;.

37
Gal Talmor

La manière typée de faire cela serait:

Number(true) // 1
Number(false) // 0
32
Philip Miglinci

Je viens de tomber sur ce raccourci aujourd'hui.

~~ (vrai)

~~ (faux)

Les gens beaucoup plus intelligents que je peux expliquer:

http://james.padolsey.com/javascript/double-bitwise-not/

28
tonyjcamp

Lorsque JavaScript attend un nombre mais reçoit un booléen, il convertit ce booléen en un nombre: true et false convertissent respectivement en 1 et 0. Vous pouvez donc en profiter.

var t = true;
var f = false;

console.log(t*1); // t*1 === 1
console.log(f*1); // f*1 === 0 

console.log(+t); // 0+t === 1 or shortened to +t === 1
console.log(+f); //0+f === 0 or shortened to +f === 0

Lectures complémentaires Type Conversions Le chapitre 3.8 du guide définitif pour Javascript.

16
Charlie Lynch

J'étais juste en train de traiter ce problème dans un code que j'écrivais. Ma solution était d'utiliser un bitwise et.

var j = bool & 1;

Un moyen plus rapide de traiter un problème constant serait de créer une fonction. Il est plus lisible par d’autres personnes, plus facile à comprendre lors de la phase de maintenance et supprime le potentiel d’écriture.

function toInt( val ) {
    return val & 1;
}

var j = toInt(bool);

Édition - 10 septembre 2014

Aucune conversion utilisant un opérateur ternaire avec l'opérateur identique à l'opérateur n'est plus rapide dans Chrome pour une raison quelconque. Cela ne donne aucun sens de la raison pour laquelle c'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.

var j = boolValue === true ? 1 : 0;

Testez par vous-même: http://jsperf.com/boolean-int-conversion/2

Dans FireFox et Internet Explorer, 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 devriez ou ne devriez pas utiliser. Tous les navigateurs flippeurs montaient et descendaient à quelle vitesse ils pouvaient effectuer l'opération avec chaque méthode. Chrome à un moment donné, la version au niveau des bits et les fichiers fonctionnaient mieux que les autres, mais soudainement, la situation était bien pire. Je ne sais pas ce qu'ils font, alors je vais m'en tenir à ceux qui s'en soucient. Il y a rarement une raison de s'inquiéter de la rapidité avec laquelle une telle opération est effectuée. Même sur mobile, c'est une opération sans rien.

En outre, voici une méthode plus récente pour ajouter un prototype 'toInt' qui ne peut pas être remplacée.

Object.defineProperty(Boolean.prototype, "toInt", { value: function()
{
    return this & 1;
}});
12
Nicholas R. Grant

L’opérateur unaire + s’occupe de ceci:

var test = true;
// +test === 1
test = false;
// +test === 0

Naturellement, vous voudrez vérifier cela sur le serveur avant de le stocker, de sorte que cela pourrait être un endroit plus judicieux pour le faire de toute façon.

11
Gustav Barkefors

Vous pouvez également ajouter 0, utiliser des opérateurs de décalage ou xor:

val + 0;
val ^ 0;
val >> 0;
val >>> 0;
val << 0;

Celles-ci ont des vitesses similaires à celles des réponses des autres.

9
REMqb

Vous pouvez le faire en étendant simplement le prototype booléen

Boolean.prototype.intval = function(){return ~~this}

Il n’est pas facile de comprendre ce qui se passe là-bas, alors une autre version serait

Boolean.prototype.intval = function(){return (this == true)?1:0}

avoir fait que vous pouvez faire des choses comme

document.write(true.intval());

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.

Boolean.prototype.intval = function(places)
{
 places = ('undefined' == typeof(places))?0:places; 
 return (~~this) << places
}

avec qui tu peux faire

document.write(true.intval(2))

qui produit 4 en sortie.

4
DroidOS
let integerVariable = booleanVariable * 1;
3
Esger

Dans mon contexte, React Native où j'obtiens la valeur d'opacité booléenne, le moyen le plus simple: Utilisez unaire + opérateur.

+ true; // 1
+ false; // 0

Ceci convertit le booléen en nombre;

style={ opacity: +!isFirstStep() }
2
Jose Velasco

essayer

val*1
let t=true;
let f=false;

console.log(t*1);
console.log(f*1)
1
Kamil Kiełczewski

J'ai testé tous ces exemples, un référentiel et, enfin, je vous recommande de choisir le plus court, cela n'affectera pas les performances.

Exécuté sur le serveur Ubuntu 14.04, nodejs v8.12.0 - 26/10/18

    let i = 0;
console.time("TRUE test1")
    i=0;
    for(;i<100000000;i=i+1){
        true ? 1 : 0;
    }
console.timeEnd("TRUE test1")


console.time("FALSE test2")
    i=0;
    for(;i<100000000;i=i+1){
        false ? 1 : 0;
    }
console.timeEnd("FALSE test2")

console.log("----------------------------")

console.time("TRUE test1.1")
    i=0;
    for(;i<100000000;i=i+1){
        true === true ? 1 : 0;
    }
console.timeEnd("TRUE test1.1")


console.time("FALSE test2.1")
    i=0;
    for(;i<100000000;i=i+1){
        false === true ? 1 : 0;
    }
console.timeEnd("FALSE test2.1")

console.log("----------------------------")

console.time("TRUE test3")
    i=0;
    for(;i<100000000;i=i+1){
        true | 0;
    }
console.timeEnd("TRUE test3")

console.time("FALSE test4")
    i=0;
    for(;i<100000000;i=i+1){
        false | 0;
    }
console.timeEnd("FALSE test4")

console.log("----------------------------")

console.time("TRUE test5")
    i=0;
    for(;i<100000000;i=i+1){
        true * 1;
    }
console.timeEnd("TRUE test5")

console.time("FALSE test6")
    i=0;
    for(;i<100000000;i=i+1){
        false * 1;
    }
console.timeEnd("FALSE test6")

console.log("----------------------------")

console.time("TRUE test7")
    i=0;
    for(;i<100000000;i=i+1){
        true & 1;
    }
console.timeEnd("TRUE test7")

console.time("FALSE test8")
    i=0;
    for(;i<100000000;i=i+1){
        false & 1;
    }
console.timeEnd("FALSE test8")

console.log("----------------------------")

console.time("TRUE test9")
    i=0;
    for(;i<100000000;i=i+1){
        +true;
    }
console.timeEnd("TRUE test9")

console.time("FALSE test10")
    i=0;
    for(;i<100000000;i=i+1){
        +false;
    }
console.timeEnd("FALSE test10")

console.log("----------------------------")

console.time("TRUE test9.1")
    i=0;
    for(;i<100000000;i=i+1){
        0+true;
    }
console.timeEnd("TRUE test9.1")

console.time("FALSE test10.1")
    i=0;
    for(;i<100000000;i=i+1){
        0+false;
    }
console.timeEnd("FALSE test10.1")

console.log("----------------------------")

console.time("TRUE test9.2")
    i=0;
    for(;i<100000000;i=i+1){
        -true*-1;
    }
console.timeEnd("TRUE test9.2")

console.time("FALSE test10.2")
    i=0;
    for(;i<100000000;i=i+1){
        -false*-1;
    }
console.timeEnd("FALSE test10.2")

console.log("----------------------------")

console.time("TRUE test9.3")
    i=0;
    for(;i<100000000;i=i+1){
        true-0;
    }
console.timeEnd("TRUE test9.3")

console.time("FALSE test10.3")
    i=0;
    for(;i<100000000;i=i+1){
        false-0;
    }
console.timeEnd("FALSE test10.3")

console.log("----------------------------")

console.time("TRUE test11")
    i=0;
    for(;i<100000000;i=i+1){
        Number(true);
    }
console.timeEnd("TRUE test11")

console.time("FALSE test12")
    i=0;
    for(;i<100000000;i=i+1){
        Number(false);
    }
console.timeEnd("FALSE test12")

console.log("----------------------------")

console.time("TRUE test13")
    i=0;
    for(;i<100000000;i=i+1){
        true + 0;
    }
console.timeEnd("TRUE test13")

console.time("FALSE test14")
    i=0;
    for(;i<100000000;i=i+1){
        false + 0;
    }
console.timeEnd("FALSE test14")

console.log("----------------------------")

console.time("TRUE test15")
    i=0;
    for(;i<100000000;i=i+1){
        true ^ 0;
    }
console.timeEnd("TRUE test15")

console.time("FALSE test16")
    i=0;
    for(;i<100000000;i=i+1){
        false ^ 0;
    }
console.timeEnd("FALSE test16")

console.log("----------------------------")

console.time("TRUE test17")
    i=0;
    for(;i<100000000;i=i+1){
        true ^ 0;
    }
console.timeEnd("TRUE test17")

console.time("FALSE test18")
    i=0;
    for(;i<100000000;i=i+1){
        false ^ 0;
    }
console.timeEnd("FALSE test18")

console.log("----------------------------")

console.time("TRUE test19")
    i=0;
    for(;i<100000000;i=i+1){
        true >> 0;
    }
console.timeEnd("TRUE test19")

console.time("FALSE test20")
    i=0;
    for(;i<100000000;i=i+1){
        false >> 0;
    }
console.timeEnd("FALSE test20")

console.log("----------------------------")

console.time("TRUE test21")
    i=0;
    for(;i<100000000;i=i+1){
        true >>> 0;
    }
console.timeEnd("TRUE test21")

console.time("FALSE test22")
    i=0;
    for(;i<100000000;i=i+1){
        false >>> 0;
    }
console.timeEnd("FALSE test22")

console.log("----------------------------")

console.time("TRUE test23")
    i=0;
    for(;i<100000000;i=i+1){
        true << 0;
    }
console.timeEnd("TRUE test23")

console.time("FALSE test24")
    i=0;
    for(;i<100000000;i=i+1){
        false << 0;
    }
console.timeEnd("FALSE test24")

console.log("----------------------------")

console.time("TRUE test25")
    i=0;
    for(;i<100000000;i=i+1){
        ~~true;
    }
console.timeEnd("TRUE test25")

console.time("FALSE test26")
    i=0;
    for(;i<100000000;i=i+1){
        ~~false;
    }
console.timeEnd("FALSE test26")

console.log("----------------------------")

console.time("TRUE test25.1")
    i=0;
    for(;i<100000000;i=i+1){
        ~true*-1-1;
    }
console.timeEnd("TRUE test25.1")

console.time("FALSE test26.1")
    i=0;
    for(;i<100000000;i=i+1){
        ~false*-1-1;
    }
console.timeEnd("FALSE test26.1")

console.log("----------------------------")

console.time("TRUE test27")
    i=0;
    for(;i<100000000;i=i+1){
        true/1;
    }
console.timeEnd("TRUE test27")

console.time("FALSE test28")
    i=0;
    for(;i<100000000;i=i+1){
        false/1;
    }
console.timeEnd("FALSE test28")

Résultat

TRUE test1: 93.301ms
FALSE test2: 102.854ms
----------------------------
TRUE test1.1: 118.979ms
FALSE test2.1: 119.061ms
----------------------------
TRUE test3: 97.265ms
FALSE test4: 108.389ms
----------------------------
TRUE test5: 85.854ms
FALSE test6: 87.449ms
----------------------------
TRUE test7: 83.126ms
FALSE test8: 84.992ms
----------------------------
TRUE test9: 99.683ms
FALSE test10: 87.080ms
----------------------------
TRUE test9.1: 85.587ms
FALSE test10.1: 86.050ms
----------------------------
TRUE test9.2: 85.883ms
FALSE test10.2: 89.066ms
----------------------------
TRUE test9.3: 86.722ms
FALSE test10.3: 85.187ms
----------------------------
TRUE test11: 86.245ms
FALSE test12: 85.808ms
----------------------------
TRUE test13: 84.192ms
FALSE test14: 84.173ms
----------------------------
TRUE test15: 81.575ms
FALSE test16: 81.699ms
----------------------------
TRUE test17: 81.979ms
FALSE test18: 81.599ms
----------------------------
TRUE test19: 81.578ms
FALSE test20: 81.452ms
----------------------------
TRUE test21: 115.886ms
FALSE test22: 88.935ms
----------------------------
TRUE test23: 82.077ms
FALSE test24: 81.822ms
----------------------------
TRUE test25: 81.904ms
FALSE test26: 82.371ms
----------------------------
TRUE test25.1: 82.319ms
FALSE test26.1: 96.648ms
----------------------------
TRUE test27: 89.943ms
FALSE test28: 83.646ms
1
DarckBlezzer