Combined Comparison / "Spaceship" Operator (<=>) in Javascript?

Kaspar Lee picture Kaspar Lee · Jan 18, 2016 · Viewed 11.7k times · Source

Ruby has something called a Combined Comparison or "Spaceship" Operator, it looks like this: <=>

It does the following:

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

Credit

Is there a similar Operator in Javascript? If not, how can I end up with the same result?


@madox2 suggested using Math.sign(a - b), which works for number, but not arrays (to compare arrays you need to use array.length).

It also does not work in Internet Explorer, Safari or all Mobile Browsers (see MDN)


@duques_l found a function here. It works very well, you can test it on JSFiddle

The only problem is if the strings are not comparable the function returns -1 instead of nil

Update: @duques_l changed the function a bit and now it works fine (I think so anyway, here is the 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;
    }
}

Answer

madox2 picture madox2 · Jan 18, 2016

As far as I know there is no such operator in JavaScript but you can use Math.sign() function:

Math.sign(a - b);

NOTE: As was mentioned in comments, Math.sign() is not currently supported by all browsers. Check for compatibility (MDN).