Подтвердить что ты не робот

Комбинированное сравнение/Оператор "Космический корабль" (<=>) в Javascript?

В Ruby есть оператор под названием "Комбинированное сравнение" или "Космический корабль", он выглядит следующим образом: <=>

Это делает следующее:

a <=> b :=
    if a < b then return -1
    if a = b then return  0
    if a > b then return  1

кредит

Есть ли подобный оператор в Javascript? Если нет, как я могу получить такой же результат?


@madox2 предложил использовать Math.sign(a - b), который работает для чисел, но не для массивов (для сравнения массивов вам нужно использовать array.length).

Он также не работает в Internet Explorer, Safari или во всех мобильных браузерах (см. MDN).


@duques_l нашел функцию здесь. Это работает очень хорошо, вы можете проверить это на JSFiddle

Единственная проблема в том, что если строки не сравнимы, функция возвращает -1 вместо nil

Обновление: @duques_l немного изменил функцию, и теперь она работает нормально (я так думаю, вот JSFiddle):

function spaceship(val1, val2) {
    if ((val1 === null || val2 === null) || (typeof val1 != typeof val2)) {
        return null;
    }
    if (typeof val1 === 'string') {
        return (val1).localeCompare(val2);
    }
    else {
        if (val1 > val2) { return 1 }
        else if (val1 < val2) { return -1 }
        return 0;
    }
}

4b9b3361

Ответ 1

Насколько я знаю, в JavaScript такого оператора нет, но вы можете использовать функцию Math.sign():

Math.sign(a - b);

ПРИМЕЧАНИЕ. Как уже упоминалось в комментариях, Math.sign() в настоящее время поддерживается не всеми браузерами. Проверьте совместимость (MDN).

Ответ 2

от: http://sabrelabs.com/post/48201437312/javascript-spaceship-operator

улучшенная версия:

function spaceship(val1, val2) {
  if ((val1 === null || val2 === null) || (typeof val1 != typeof val2)) {
    return null;
  }
  if (typeof val1 === 'string') {
    return (val1).localeCompare(val2);
  } else {
    if (val1 > val2) {
      return 1;
    } else if (val1 < val2) {
      return -1;
    }
    return 0;
  }
}