3 回答

TA贡献1858条经验 获得超8个赞
字符串,字符串比较基于Unicode顺序(a大于A)。
字符串,数字比较首先将字符串转换为数字,然后再进行比较(与无穷大相同)。
字符串,数组比较首先将数组转换为字符串,然后如上所述进行比较。

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
添加回答
举报