猿问

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

当比较运算符的输入作为两个字符串值给出时,比较运算符喜欢>和<返回Boolean值。


我尝试了几个例子:


/* String vs String */

console.log('firstName' < 'lastname'); // true

console.log('firstName' < 'Firstname'); // false

console.log('!firstName' < 'lastname'); // true

console.log('!firstName' < 'Firstname'); // true

console.log('!firstName' < '!Firstname'); // false

console.log('!firstName' < '_!Firstname'); // true

console.log('@!firstName' < '_!Firstname'); // true

console.log('@!firstName' < '2_!Firstname'); // false


/* String vs Number */

console.log('@!firstName' < 2); // false

console.log('@!firstName' < -1); // false


/* String vs Special Numbers */

console.log('@!firstName' < Infinity); // false

console.log('@!firstName' < -Infinity); // false

console.log('@!firstName' < -Infinity + Infinity); // false


/* String vs NaN */

console.log('@!firstName' < NaN); // false

console.log(NaN.toString()); // "NaN"

console.log('@!firstName' < "NaN"); // true


/* String vs Arrays */

console.log('firstName' < [Infinity, -Infinity]); // false

console.log('firstName' < ['Firstname', Infinity, -Infinity]); // false

console.log('firstName' < ['2_Firstname', Infinity, -Infinity]); // false

我真的很想知道JavaScript如何真正评估这些表达式。在上面的示例中,我发现这是最迷人的一个console.log('@!firstName' < Infinity); // false

因此,我的问题是:

在这些情况下,如何在JavaScript中使用“大于”和“小于”运算符完成比较(来自上述示例):

  1. 字符串vs字符串,

  2. 字符串与数字,

  3. 字符串与特殊数字,

  4. 字符串vs NaN,

  5. 字符串与数组


慕码人2483693
浏览 150回答 3
3回答

猛跑小猪

字符串,字符串比较基于Unicode顺序(a大于A)。字符串,数字比较首先将字符串转换为数字,然后再进行比较(与无穷大相同)。字符串,数组比较首先将数组转换为字符串,然后如上所述进行比较。

MYYA

采取的精确步骤在描述规范,具体描述了在该比较的一个(或两个)侧面的情况下做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) {&nbsp; for (let i = 0; i < left.length; i++) {&nbsp; &nbsp; const c1 = left[i].charCodeAt();&nbsp; &nbsp; const c2 = right[i].charCodeAt();&nbsp; &nbsp; if (c1 !== c2) {&nbsp; &nbsp; &nbsp; console.log('Char code comparision:', c1 < c2, '< comparison:', left < right);&nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; }&nbsp; }}/* String vs String */compare('firstName', 'lastname'); // truecompare('firstName', 'Firstname'); // falsecompare('!firstName', 'lastname'); // truecompare('!firstName', 'Firstname'); // truecompare('!firstName', '!Firstname'); // falsecompare('!firstName', '_!Firstname'); // truecompare('@!firstName', '_!Firstname'); // truecompare('@!firstName', '2_!Firstname'); // false
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答