为了账号安全,请及时绑定邮箱和手机立即绑定

在JavaScript中将两个字符串与'<'和'>'运算符进行比较

在JavaScript中将两个字符串与'<'和'>'运算符进行比较

慕码人2483693 2021-05-11 17:31:33
当比较运算符的输入作为两个字符串值给出时,比较运算符喜欢>和<返回Boolean值。我尝试了几个例子:/* String vs String */console.log('firstName' < 'lastname'); // trueconsole.log('firstName' < 'Firstname'); // falseconsole.log('!firstName' < 'lastname'); // trueconsole.log('!firstName' < 'Firstname'); // trueconsole.log('!firstName' < '!Firstname'); // falseconsole.log('!firstName' < '_!Firstname'); // trueconsole.log('@!firstName' < '_!Firstname'); // trueconsole.log('@!firstName' < '2_!Firstname'); // false/* String vs Number */console.log('@!firstName' < 2); // falseconsole.log('@!firstName' < -1); // false/* String vs Special Numbers */console.log('@!firstName' < Infinity); // falseconsole.log('@!firstName' < -Infinity); // falseconsole.log('@!firstName' < -Infinity + Infinity); // false/* String vs NaN */console.log('@!firstName' < NaN); // falseconsole.log(NaN.toString()); // "NaN"console.log('@!firstName' < "NaN"); // true/* String vs Arrays */console.log('firstName' < [Infinity, -Infinity]); // falseconsole.log('firstName' < ['Firstname', Infinity, -Infinity]); // falseconsole.log('firstName' < ['2_Firstname', Infinity, -Infinity]); // false我真的很想知道JavaScript如何真正评估这些表达式。在上面的示例中,我发现这是最迷人的一个console.log('@!firstName' < Infinity); // false。因此,我的问题是:在这些情况下,如何在JavaScript中使用“大于”和“小于”运算符完成比较(来自上述示例):字符串vs字符串,字符串与数字,字符串与特殊数字,字符串vs NaN,字符串与数组
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

字符串,字符串比较基于Unicode顺序(a大于A)。

字符串,数字比较首先将字符串转换为数字,然后再进行比较(与无穷大相同)。

字符串,数组比较首先将数组转换为字符串,然后如上所述进行比较。


查看完整回答
反对 回复 2021-05-27
?
MYYA

TA贡献1868条经验 获得超4个赞

采取的精确步骤在描述规范,具体描述了在该比较的一个(或两个)侧面的情况下做NaN+Infinity-Infinity。对于px < py,例如,低于运营商调用抽象关系比较算法:

11.8.5抽象关系比较算法

(如果要比较的两个项目都不是字符串,则:)

令nx为调用ToNumber(px)的结果。因为px和py是原始值,所以评估顺序并不重要。

令ny为调用ToNumber(py)的结果。

如果nx为NaN,则返回undefined。

如果ny为NaN,则返回undefined。

如果nx和ny是相同的Number值,则返回false。

如果nx为+ 0,ny为−0,则返回false。

如果nx为-0,ny为+0,则返回false。

如果nx为+∞,则返回false。

如果ny为+∞,则返回true。

如果ny为-∞,则返回false。

如果nx为-∞,则返回true。

如果nx的数学值小于ny的数学值(请注意,这些数学值都是有限的且不都是零),则返回true。否则,返回false。

否则,px和py都是字符串

如果py是px的前缀,则返回false。(如果q可以是连接p和其他String r的结果,则String值p是String值q的前缀。请注意,任何String都是其自身的前缀,因为r可能是空String。)

如果px是py的前缀,则返回true。

令k为最小的非负整数,以使px内的位置k处的字符与py内的位置k处的字符不同。(必须有这样的ak,因为String都不是另一个的前缀。)

令m为整数,它是px内第k位的字符的代码单位值。

令n为整数,它是py中位置k处字符的代码单位值。

如果m <n,则返回true。否则,返回false。

当两个被比较的项目都是字符串时,它有效地导致每个字符的代码点被比较。例如,'firstName' < 'lastname'因为f(102)的字符代码小于l(108)的字符代码。对于'!firstName' < 'Firstname'!(33)的字符代码小于F(70)的字符代码,因此也true等于。有关实现的示例,请参见以下代码片段:

function compare(left, right) {

  for (let i = 0; i < left.length; i++) {

    const c1 = left[i].charCodeAt();

    const c2 = right[i].charCodeAt();

    if (c1 !== c2) {

      console.log('Char code comparision:', c1 < c2, '< comparison:', left < right);

      break;

    }

  }

}


/* String vs String */

compare('firstName', 'lastname'); // true

compare('firstName', 'Firstname'); // false

compare('!firstName', 'lastname'); // true

compare('!firstName', 'Firstname'); // true

compare('!firstName', '!Firstname'); // false

compare('!firstName', '_!Firstname'); // true

compare('@!firstName', '_!Firstname'); // true

compare('@!firstName', '2_!Firstname'); // false


查看完整回答
反对 回复 2021-05-27
  • 3 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信