У меня есть переменная, которая хранит false
или true
, но мне нужно 0
или 1
вместо, соответственно. Как я могу это сделать?
276
У меня есть переменная, которая хранит false
или true
, но мне нужно 0
или 1
вместо, соответственно. Как я могу это сделать?
bool === true ? 1 : 0
, так как он на сегодняшний день самый быстрый в V8.bool ? 1 : 0;
Ответы:
Javascript имеет троичный оператор, который вы можете использовать:
источник
NaN
. Так что, если вы хотите L33T и гарантируете ввод, переходите на другую, иначе лучше использовать троичный + правдивый тест.Используйте унарный
+
оператор , который преобразует свой операнд в число.Обратите внимание, конечно, что вы все равно должны санировать данные на стороне сервера, потому что пользователь может отправлять любые данные вашему серверу, независимо от того, что говорит код на стороне клиента.
источник
Number()
еще медленнее.bool === true ? 1 : 0
это самый быстрый, с близкой секундой отbool | 0
.Imho лучшее решение:
Это используется в asm.js для принудительного использования целочисленного типа.
источник
1
целое число, если fooBar нет?Я предпочитаю использовать функцию Number . Он берет объект и преобразует его в число.
Пример:
Вы можете проверить это в jsFiddle .
источник
Я создал сравнение JSperf всех предложенных ответов.
TL; DR - лучший вариант для всех существующих браузеров:
,
Обновить:
Кажется, что в наши дни все они довольно идентичны, за исключением того, что
Number()
функция самая медленная, а самая лучшаяval === true ? 1 : 0;
.источник
Типизированный способ сделать это будет:
источник
Я только что наткнулся на этот ярлык сегодня.
~~ (истина)
~~ (ложь)
Люди намного умнее, чем я могу объяснить
http://james.padolsey.com/javascript/double-bitwise-not/
источник
Когда JavaScript ожидает числовое значение, но получает вместо него логическое значение, он преобразует это логическое значение в число: true и false преобразуются в 1 и 0 соответственно. Таким образом, вы можете воспользоваться этим;
Дальнейшее чтение Преобразования типов Глава 3.8 Полное руководство по Javascript.
источник
Унарный
+
оператор позаботится об этом:Вы, естественно, захотите проверить это на сервере перед сохранением, так что в любом случае это может быть более разумным местом для этого.
источник
===
, потому чтоtrue == 1
это правда, даже если вы "явное преобразование :-)true === 1
вместо этого ложно.Я просто имел дело с этой проблемой в каком-то коде, который писал. Моим решением было использовать побитовое и.
Более быстрый способ справиться с постоянной проблемой - создать функцию. Это лучше читается другими людьми, лучше для понимания на этапе обслуживания и избавляет от возможности написать что-то не так.
Изменить - 10 сентября 2014 г.
По какой-то причине в Chrome не выполняется преобразование с использованием троичного оператора с идентичным оператору. Не имеет смысла, почему это быстрее, но я полагаю, что это своего рода оптимизация низкого уровня, которая имеет смысл где-то по пути.
Проверьте сами: http://jsperf.com/boolean-int-conversion/2
В FireFox и Internet Explorer использование версии, которую я разместил, обычно происходит быстрее.
Редактировать - 14 июля 2017
Хорошо, я не собираюсь говорить вам, какой из них вы должны или не должны использовать. Каждый взбешенный браузер постоянно поднимал и опускался в зависимости от того, насколько быстро они могут выполнять операции с каждым методом. В какой-то момент у Chrome битовая версия работала лучше, чем у других, но вдруг все стало намного хуже. Я не знаю, что они делают, поэтому я просто оставлю это тем, кого это волнует. Редко есть причина беспокоиться о том, как быстро выполняется такая операция. Даже на мобильном телефоне это пустая операция.
Кроме того, вот новый метод для добавления прототипа toInt, который нельзя перезаписать.
источник
Вы также можете добавить 0, использовать операторы shift или xor:
Они имеют те же скорости, что и ответы других.
источник
В моем контексте, React Native, где я получаю значение непрозрачности из логического, самый простой способ: использовать унарный оператор +.
Это преобразует логическое число в число;
источник
Вы можете сделать это, просто расширив логический прототип
Нелегко понять, что там происходит, поэтому альтернативная версия будет
сделав что вы можете сделать такие вещи, как
Когда я использую логические значения для хранения условий, я часто конвертирую их в битовые поля, и в этом случае я использую расширенную версию функции-прототипа.
с помощью которого вы можете сделать
который производит 4 в качестве своего выхода.
источник
источник
пытаться
Показать фрагмент кода
источник
Я протестировал все эти примеры, сделал тест и, наконец, рекомендую выбрать более короткий, он не влияет на производительность.
результат
источник
если вы хотите, чтобы целочисленное значение x изменялось с 1 на 0, а с 0 на 1 вы можете использовать (x + 1)% 2
источник