将布尔结果转换为数字/整数

我有一个variables存储falsetrue ,但我需要分别为01 。 我怎样才能做到这一点?

JavaScript有一个三元操作符,你可以使用:

 var i = result ? 1 : 0; 

使用一元+运算符 ,将其操作数转换为数字。

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

请注意,当然,您仍然应该在服务器端对数据进行清理,因为无论客户端代码如何,用户都可以将任何数据发送到服务器。

Imho最好的解决scheme是:

 fooBar | 0 

这在asm.js中用来强制整型。

我更喜欢使用数字function 。 它需要一个对象并将其转换为数字。
例:

 var myFalseBool = false; var myTrueBool = true; var myFalseInt = Number(myFalseBool); console.log(myFalseInt == 0); var myTrueInt = Number(myTrueBool); console.log(myTrueInt == 1); 

或者在jsFiddle中运行它。

我创build了所有build议答案的JSperf比较。

TL; DR–目前所有浏览器的最佳select是:

 val | 0; 

我今天刚刚遇到这个捷径。

~~(真)

~~(假)

比我能解释得更聪明的人:

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

打字的方式是:

 Number(true) // 1 Number(false) // 0 

当JavaScript需要一个数字值,但接收到一个布尔值时,它会将该布尔值转换为一个数字:true和false分别转换为1和0。 所以你可以利用这个;

 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 

一元+运营商将照顾这个:

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

但是,在存储服务器之前,您自然会想要在服务器上进行检查,所以无论如何这可能是一个更明智的做法。

我只是在写一些代码来处理这个问题。 我的解决scheme是使用一个按位和。

 var j = bool & 1; 

处理一个不变的问题的一个更快的方法是创build一个函数。 它更容易被其他人读取,更好地理解维护阶段,并且摆脱写错的潜力。

 function toInt( val ) { return val & 1; } var j = toInt(bool); 

编辑 – 2014年9月10日

由于某些原因,使用与运算符相同的三元运算符进行的转换在Chrome中不会更快。 没有意义,为什么它更快,但我认为这是某种低级别的优化,在某种程度上是有道理的。

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

为自己testing: http : //jsperf.com/boolean-int-conversion/2

在FireFox和Internet Explorer中,使用我发布的版本通常更快。

编辑 – 2017年7月14日

好吧,我不会告诉你哪一个你应该或不应该使用。 每一个疯狂的浏览器都在不断的上升和下降,他们可以用每种方法进行操作。 Chrome在某一点上实际上已经比其他版本做得更好,但是后来突然变得更糟了。 我不知道他们在做什么,所以我只是把它留在谁的心里。 很less有理由关心这样的操作有多快。 即使在移动设备上,这也不算什么。

另外,下面是添加不能被覆盖的“toInt”原型的新方法。

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

你也可以加0,使用移位运算符或者xor:

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

这些速度与其他人的速度相似。

你可以通过简单地扩展布尔原型来做到这一点

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

理解那里正在发生的事情并不太容易,所以可以使用替代版本

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

做了你可以做的东西

 document.write(true.intval()); 

当我使用布尔值来存储条件时,我经常将它们转换为位域,在这种情况下,我最终使用原型函数的扩展版本

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

你可以做什么

 document.write(true.intval(2)) 

产生4个输出。