Javascript中的组合比较/“宇宙飞船”运算符(<=>)?
Posted
技术标签:
【中文标题】Javascript中的组合比较/“宇宙飞船”运算符(<=>)?【英文标题】:Combined Comparison / "Spaceship" Operator (<=>) in Javascript? 【发布时间】:2016-04-23 12:19:28 【问题描述】:Ruby 有一个叫做组合比较或“宇宙飞船”运算符的东西,它看起来像这样:<=>
它执行以下操作:
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中的组合比较/“宇宙飞船”运算符(<=>)?的主要内容,如果未能解决你的问题,请参考以下文章