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

情到浓时终转凉″ 提交于 2019-12-20 17:33:25

问题


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;
    }
}


回答1:


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).




回答2:


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

improved version:

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;
  }
}


来源:https://stackoverflow.com/questions/34852855/combined-comparison-spaceship-operator-in-javascript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!