我从一本书中看到了这段代码:
var a = "one";
var b = "four";
a>b; // will return true
但它没有提到为什么"一个"大于"四"。我试过c = "a"
,它比a和b小。我想知道JavaScript如何比较这些字符串。
答案 0 :(得分:38)
因为,与许多编程语言一样,字符串被比较lexicographically。
您可以将此视为alphabetical ordering的更高版本,不同之处在于字母顺序仅涵盖a
到z
的26个字符。
This answer是对java问题的回应,但逻辑完全相同。另一个好的:String Compare "Logic"。
答案 1 :(得分:10)
“one”以'o'开头,“four”以'f'开头,'o'在字母表中的后面比'f'更晚,因此“one”大于“4”。有关JavaScript字符串比较的一些很好的例子,请参阅this page。(解释!)。
答案 2 :(得分:3)
Javascript使用> 运算符的词典顺序。 'f'进行'o'所以比较“one”> “四个”返回 true
答案 3 :(得分:1)
当您在 JavaScript 中对字符串使用 head
等关系运算符时,您是在比较它们的底层 Unicode 代码单元¹,从头开始一次一个,第一次发现任何差异时停止。 None
为真,因为 <=
(代码单元 111)大于 "one" > "four"
(代码单元 102)。由于在第一个字符中发现差异,其余字符将被忽略。如果您有 "o"
,则将比较两个 "f"
,发现相同,然后每个字符串的下一个字母("fb" > "fa"
和 "f"
)将是比较的。如果字符串的长度不同,并且较长的从较短的开始,则较短的“小于”较长的("b"
为 "a"
)。
这曾经被规范中的 Abstract Relational Comparison 操作所涵盖,但现在是 IsLessThan 操作。
¹ 关系运算符使用代码单元这一事实是不将它们与字符串一起使用的一个很好的理由,因为在许多情况下,代码单元顺序并不能很好地映射到人们基于他们的期望语言("aaa" < "aaab"
< true
是 "é"
,这对于讲法语的人来说可能没什么意义);相反,使用 localeCompare
,也许带有一些可选设置,以便与字符串包含的语言进行适当的比较("z"
是 false
,因为 "é".localeCompare("z", "fr") < 0
在 true
之前出现在é
语言环境中的正确字典顺序)。
答案 4 :(得分:0)
在11th edition of the ECMAScript Language Specification中,"Abstract Relational Comparison" clause定义了如何计算x < y
。恢复表达式(即x > y
)后,我们应该改为计算y < x
的结果。
因此要解决"one" > "four"
,我们必须改为解决"four" < "one"
。
同一子句说:
字符串的比较对代码单位值的序列使用简单的字典顺序。
如果两个操作数都是字符串,则为:
- 如果Type(px)是String且Type(py)是String,则
- 如果IsStringPrefix(py,px)为true,则返回false。
- 如果IsStringPrefix(px,py)为true,则返回true。
- 让k为最小的非负整数,以使px内索引k处的代码单元与py内索引k处的代码单元不同。 (必须有一个k,因为String都不是另一个的前缀。)
- 让m为整数,它是px内索引k处的代码单位的数值。
- 让n为整数,它是py内索引k处的代码单位的数值。
- 如果m
(在此示例中,我们可以放心地忽略前两点)
因此,让我们看一下“四个”的代码单元:
[..."four"].map(c => c.charCodeAt(0));
//=> [102, 111, 117, 114]
对于“一个”:
[..."one"].map(c => c.charCodeAt(0));
//=> [111, 110, 101]
所以现在我们必须找到 k 的值(从0开始),其中 m [k] 和 n [k] 均为不同:
| | 0 | 1 | 2 | 3 |
|---|-----|-----|-----|-----|
| m | 102 | 111 | 117 | 114 |
| n | 111 | 110 | 101 | |
我们可以看到 m [0] 和 n [0] 都为0。
因为 m [0] "four" < "one"
为真,因此"one" > "four"
为真。
"☂︎" < "☀︎"
返回什么?[..."☂︎"].map(c => c.charCodeAt(0))
//=> [9730, 65038]
[..."☀︎"].map(c => c.charCodeAt(0))
//=> [9728, 65038]
| | 0 | 1 |
|---|------|-------|
| m | 9730 | 65038 |
| n | 9728 | 65038 |
由于9730 < 9728
为假,所以"☂︎" < "☀︎"
为假,这很好,因为雨并不比太阳好(显然是;)。