27

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

4

3 回答 3

23

据我所知,JavaScript 中没有这样的运算符,但您可以使用Math.sign()函数:

Math.sign(a - b);

注意:正如评论中提到的,目前并非所有浏览器都支持 Math.sign()。检查兼容性 ( MDN )。

于 2016-01-18T10:51:41.387 回答
8

来自: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;
  }
}
于 2016-01-18T11:36:01.197 回答
0

这是当前 js ES2020的单行代码?:

const spaceship = (a, b) => (a ?? 0).toString().localeCompare((b ?? 0).toString());

返回所有内容的字符串比较。

于 2021-10-25T17:29:51.233 回答