Преобразовать логический результат в число / целое число - PullRequest
222 голосов
/ 19 октября 2011

У меня есть переменная, в которой хранятся false или true, но вместо этого мне нужны 0 или 1 соответственно. Как я могу это сделать?

Ответы [ 15 ]

384 голосов
/ 19 октября 2011

Используйте унарный + оператор , который преобразует свой операнд в число.

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

Обратите внимание, конечно, что вы все равно должны санировать данные на стороне сервера, потому что пользователь может отправлять любые данные на сервер независимо от того, что говорит код на стороне клиента.

292 голосов
/ 19 октября 2011

Javascript имеет троичный оператор, который вы можете использовать:

var i = result ? 1 : 0;
97 голосов
/ 07 марта 2014

Imho лучшее решение:

fooBar | 0

Используется в asm.js для принудительного ввода целого типа.

48 голосов
/ 07 мая 2013

Я предпочитаю использовать функцию Число . Он берет объект и преобразует его в число.
Пример:

var myFalseBool = false;
var myTrueBool = true;

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

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

Или запустите его в jsFiddle .

36 голосов
/ 09 марта 2015

Я создал JSperf сравнение всех предложенных ответов.

TL; DR - лучший вариант для всех текущих браузеров:

val | 0;

.

Обновление:

Кажется, что в наши дни все они довольно идентичны, за исключением того, что функция Number() является самой медленной, в то время как лучшим является val === true ? 1 : 0;.

31 голосов
/ 29 ноября 2016

Типизированный способ сделать это будет:

Number(true) // 1
Number(false) // 0
28 голосов
/ 07 марта 2012

Я только что наткнулся на этот ярлык сегодня.

* * 1002 ~~ (истина) * * 1004 ~~ (ложь)

Люди намного умнее, чем я могу объяснить:

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

15 голосов
/ 04 июня 2016

Когда 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

Дальнейшее чтение Преобразования типов Глава 3.8 Полного руководства по Javascript.

12 голосов
/ 19 февраля 2013

Я имел дело с этой проблемой в каком-то коде, который писал.Мое решение состояло в том, чтобы использовать побитовое и.

var j = bool & 1;

Более быстрый способ справиться с постоянной проблемой - создать функцию.Это более читабельно для других людей, лучше для понимания на этапе обслуживания и избавляет от возможности написать что-то неправильно.

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

var j = toInt(bool);

Редактировать - 10 сентября 2014 г.

По какой-то причине в Chrome не выполняется преобразование с использованием троичного оператора с идентичным оператору.Не имеет смысла объяснять, почему это быстрее, но я полагаю, что это своего рода оптимизация низкого уровня, которая имеет смысл где-то по пути.

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

Проверьте себя: http://jsperf.com/boolean-int-conversion/2

ВFireFox и Internet Explorer, используя версию, которую я выложил, обычно быстрее.

Редактировать - 14 июля 2017 г.

Хорошо, я не собираюсь говорить вам, какая из нихВы должны или не должны использовать.Каждый взбешенный браузер все время показывал, насколько быстро они могут выполнять операции с каждым методом.В какой-то момент у Chrome битовая версия работала лучше, чем у других, но вдруг все стало намного хуже.Я не знаю, что они делают, поэтому я просто оставлю это тем, кого это волнует.Редко есть причина беспокоиться о том, как быстро выполняется такая операция.Даже на мобильных устройствах это пустая операция.

Кроме того, есть более новый метод добавления прототипа toInt, который нельзя перезаписать.

Object.defineProperty(Boolean.prototype, "toInt", { value: function()
{
    return this & 1;
}});
11 голосов
/ 19 октября 2011

Унарный + оператор позаботится об этом:

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

Вы, естественно, захотите проверить это на сервере перед сохранением, так что в любом случае это может быть более разумным местом для этого.

...