将布尔结果转换为数字/整数
我有一个variables存储false
或true
,但我需要分别为0
或1
。 我怎样才能做到这一点?
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;
打字的方式是:
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个输出。