JavaScript中的组合比较/“飞船”运算符(<=>)是什么?

32

Ruby有一个名为"太空船"运算符或Combined Comparison运算符,它看起来像这样:<=>

它执行以下操作:

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


不存在,但可以在http://sabrelabs.com/post/48201437312/javascript-spaceship-operator找到相关内容。 - Léo
@duques_l 有趣的链接。那个函数似乎确实做到了这一点! - Kaspar Lee
3个回答

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

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


这适用于数字,但不适用于数组(好吧,你必须使用array.length)。聪明的解决方案! - Kaspar Lee
@NinaScholz 如果有一个什么? - Kaspar Lee
1
@Druzion,Internet Explorer没有Math.sign() - Nina Scholz
@NinaScholz 啊,是的,根据MDN,它也不支持Safari和所有移动浏览器。 - Kaspar Lee
2
截至今天并根据CanIUse.com的数据:Math.sign已被近95%的浏览器支持。如果你的目标客户是那些更新他们的浏览器的人,你可以认为现在使用它是安全的。 - Romain 'Maz' BILLOIR
显示剩余2条评论

9

来源: 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;
  }
}

不,如果数据类型不同,它会返回0。请查看新的JSFiddle - Kaspar Lee
它已经修复了,你能检查一下吗? - Léo
在JavaScript中,nil不存在,应该使用null - Léo

2

这是一行关于当前js ES2020的代码:

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

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

2
由于这个函数使用字符串比较来处理数字,所以对于输入的位数不同的情况下,可能会得到无效的结果。例如,spaceship(100, 2)会得到-1(因为它实际上是按字母顺序排序,而第一个“字母”12“小”)。 - undefined
由于这里对所有内容都使用字符串比较,对象和数组将无法排序...因为它们的字符串表示将是“[object Object]”,而这与它自身相等。0既不是-1也不是1。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接