Javascript中的组合比较/“宇宙飞船”运算符(<=>)?

Posted

技术标签:

【中文标题】Javascript中的组合比较/“宇宙飞船”运算符(<=>)?【英文标题】:Combined Comparison / "Spaceship" Operator (<=>) in Javascript? 【发布时间】:2016-04-23 12:19:28 【问题描述】:

Ruby 有一个叫做组合比较或“宇宙飞船”运算符的东西,它看起来像这样:&lt;=&gt;

它执行以下操作:

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

Credit

javascript 中是否有类似的运算符?如果不是,我怎样才能得到相同的结果?


@madox2 建议使用Math.sign(a - b),它适用于数字,但不适用于数组(要比较数组,您需要使用array.length)。

它也不适用于 Internet Explorer、Safari 或所有移动浏览器(请参阅MDN)


@duques_l 找到了一个函数 here。效果很好,你可以在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;
    


【问题讨论】:

不存在,但sabrelabs.com/post/48201437312/javascript-spaceship-operator @duques_l 有趣的链接。该功能似乎确实可以做到这一点! 【参考方案1】:

这是 current js ES2020 的单行代码?:

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

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

【讨论】:

【参考方案2】:

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

Math.sign(a - b);

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

【讨论】:

这适用于数字,但不适用于数组(好吧,您必须使用array.length)。聪明的解决方案! 如果有,不在ie中。 @NinaScholz 如果有什么? @Druzion,Internet Explorer 没有Math.sign() 截至今天,根据 CanIUse.com 的说法:Math.sign is supported by almost 95% browsers。如果您的目标客户是更新浏览器的人,您可以假设现在可以安全使用它。【参考方案3】:

来自: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 已修复,您可以检查一下吗? nil 在 javascript 中不存在,它是 null

以上是关于Javascript中的组合比较/“宇宙飞船”运算符(<=>)?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Ruby <=>(宇宙飞船)运算符?

PHP 7 中的 <=> (“宇宙飞船”运算符)是啥? [复制]

使用宇宙飞船运算符按两个参数对数组进行排序[重复]

为啥在 C++ 20 中从标准库容器中删除了比较运算符?

三元运算符如何比较 JavaScript 中的字符和数字?

PHP <=> 太空船运算符(组合比较符)