我从一本书中看到了这段代码:
var a = "one";
var b = "four";
a>b; // will return true
但它没有提到为什么"one"比"four"大。我尝试了c = "a"
,它比a和b都小。我想知道JavaScript如何比较这些字符串。
我从一本书中看到了这段代码:
var a = "one";
var b = "four";
a>b; // will return true
但它没有提到为什么"one"比"four"大。我尝试了c = "a"
,它比a和b都小。我想知道JavaScript如何比较这些字符串。
a
到z
。
这个答案是针对一个Java问题的回答,但逻辑完全相同。另一个好的例子:String Compare "Logic"。
:)
。 - Matt Ball"one"以'o'开头,"four"以'f'开头,'o'在字母表中比'f'靠后,因此"one"大于"four"。请参考此页面获取一些JavaScript字符串比较的示例(包含解释!)。
Javascript中的>运算符使用词典顺序。'f'在'o'之前,因此比较"one" > "four"返回true
x < y
。当表达式被反转时(即x > y
),我们应该计算y < x
的结果。
因此,要解决"one" > "four"
,我们必须解决"four" < "one"
。
同样的条款也说:
字符串的比较使用代码单元值序列上的简单词典排序。
如果两个操作数都是字符串,则会出现这种情况:
(对于本示例我们可以安全忽略前两条)
那么让我们看一下“four”的代码单元:
[..."four"].map(c => c.charCodeAt(0));
//=> [102, 111, 117, 114]
而对于“one”:
[..."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 | |
"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
是假的,那么 "☂︎" < "☀︎"
也是假的,这很好,因为雨并不比阳光更好(显然 ;)。
<=
这样的关系运算符比较字符串时,你正在比较它们的基本Unicode代码单元,从开头逐个比较,第一次找到任何差异时停止。 "one" > "four"
是true,因为"o"
(代码单元111)大于"f"
(代码单元102)。由于在第一个字符中找到了差异,其余字符被忽略。 如果你有"fb" > "fa"
,那么两个"f"
将被比较,发现它们相同,然后将比较每个字符串的下一个字母("b"
和"a"
)。如果字符串长度不同并且更长的字符串以较短的字符串开头,则较短的字符串“小于”较长的字符串("aaa" < "aaab"
是true
)。
这个操作以前在规范中由抽象关系比较操作处理,但现在使用小于操作。
事实上,关系运算符使用的是代码单元,这是不适用于字符串的一个很好的理由,因为在许多情况下,代码单元的顺序与人们根据其语言的期望不匹配("é"
< "z"
是 false
,这对法语说话者可能没有什么意义);相反,应该使用 localeCompare
,或许还可以使用一些可选设置,以便为字符串包含的语言适当地进行比较("é".localeCompare("z", "fr") < 0
是 true
,因为在“fr”区域设置中,é
在适当的词典顺序中排在z
之前)。
"z" > "y"; "y" > "c"; "c" > "b"; "b" > "a";
- Luke