Преобразовать true и false в Coffeescript в 1 и -1 соответственно - PullRequest
0 голосов
/ 22 декабря 2011
if x < change.pageX # pageX is cross-browser normalized by jQuery
            val = Number(elem.text())
            return elem.text(o.max) if val + o.step > o.max
            return elem.text(o.min) if val + o.step < o.min
            elem.text(val + o.step)
else x > change.pageX
  # same thing, only - instead of +

(Сценарий кофе, но вы поняли). Я ищу трюк, чтобы взять логическое значение и преобразовать его в 1 (true) или -1 (false). таким образом я могу сделать val + converted_bool * o.step и сохранить if.

Ответы [ 7 ]

9 голосов
/ 22 декабря 2011

Вы можете сделать это следующим образом ...

+x||-1

  • Если x===true, +x равно 1, а -1 равнокороткое замыкание.

  • Если x===false, +x равно 0, и возвращается -1.


Вот еще один способ ...

[-1,1][+x]
  • Если x===true, [+x] захватит индекс 1 массива.

  • Если x===false, [+x] захватит индекс 0 массива.

5 голосов
/ 22 декабря 2011

Похоже на работу для условного (троичного) оператора

if true then 1 else -1
1
if false then 1 else -1
-1
1 голос
/ 22 декабря 2011

(~ true) +3 и (~ false) даст вам 1 и отрицательный:)

1 голос
/ 22 декабря 2011

Мне кажется, что это будет работать:

b2i = (x) -> if x then 1 else -1
b2i(true)  # => 1
b2i(false) # => -1

Это определение функции приведет к (не очень захватывающему) JavaScript:

var b2i;

b2i = function(x) {
  if (x) {
    return 1;
  } else {
    return -1;
  }
};

Обратите внимание , что CoffeeScript ? является экзистенциальным оператором, поэтому

x ? 1 : -1

превратится в что-то немного неожиданное, как

if (typeof x !== "undefined" && x !== null) {
  x;
} else {
  ({ 1: -1 });
};
0 голосов
/ 27 декабря 2011

Вы также можете ввести javascript внутри coffeescript:

foo = `bar ? 1 : -1`
0 голосов
/ 22 декабря 2011

Ах, Ха!

2 * (!!expression) - 1

0 голосов
/ 22 декабря 2011

Вы ищете что-нибудь кроме этого простого javscript:

boolVal ? 1 : -1

Или, в форме функции:

function convertBool(boolVal) {
    return(boolVal ? 1 : -1);
}

Прямая математика с булевыми значениями преобразует true в 1и от false до 0:

var x,y;
x = false;
y = 2;
alert(y + x);  // alerts 2

x = true;
y = 2;
alert(y + x);  // alerts 3

Если производительность представляет интерес, вот jsperf test из четырех методов, предлагаемых в качестве ответов здесь.В Chrome троичное решение работает более чем в 7 раз.

...