JavaScript 的 '>' 运算符如何将字符与空格进行比较?

8

我正在尝试理解这个表达式:

((ch = stream.getChar()) > ' ')

在这里,getChar()获取一个字符。这个大于号比较运算符如何检查任何字符是否大于空格?

这可能吗?


既然现在事情已经解释清楚了,你需要告诉我们更多的背景信息,我很想知道为什么有人要检查这个。 - Sebas
7个回答

12

一个空格也有一个字符代码。尽管它看起来不起眼,但它仍然有一个值。从流中取出的字符也是如此。比较这些值的字符代码就是产生输出的原因。


当比较两个字符串时,比较的是它们的字符编码吗? - Sebas
1
是的,当比较字符串时,它会比较它们的字符编码。 - christopher
2
@Sebas 字符串比较是迭代的:逐个字符比较。 - VisioN
1
我明白了。非常感谢你们,太棒了!因此,在比较字符串时的字母顺序是巧合。如果“a”的字符代码高于“b”,我们将有“a”>“b”。谜团解决了。 - Sebas
1
除了适用于英语之外,在某些语言中(例如俄语)字母的排列方式可能不正确。因此,如果使用不同的字母表,则应谨慎使用此类比较。 - VisioN
显示剩余10条评论

9
让我们来看一下语言规范(算法本身在这里中描述)(请注意,它定义了<,但>运算符只是翻转结果值)。
操作符的作用是尝试将两个操作数转换为基本类型,优先考虑数字:
2. a. Let py be the result of calling ToPrimitive(y, hint Number).
2. b. Let px be the result of calling ToPrimitive(x, hint Number).

在我们的情况下,x === stream.getChar()y === ' '。由于这两个操作数已经是原始字符串,因此结果为原始值 (px = x, py = y),然后我们继续执行:
4. Else, both px and py are Strings

现在它会检查操作数中是否存在一个是另一个的前缀,例如:
'abc' > 'abcd' // false
'foo' > 'foobar' // false

如果getChar()返回一个空格,那么这个空格就是其本身的前缀,这时候就显得非常重要了:

' ' > ' ' // false

我们继续寻找在字符串中相同位置但不同的第一个字符xy

令k为最小的非负整数,满足px中第k个字符与py中第k个字符不同。(由于没有一个字符串是另一个字符串的前缀,因此必须存在这样的k。)

(例如,'efg''efh',我们要找到gh
然后将找到的字符转换为它们的整数值:
Let m be the integer that is the code unit value for the character at position k within px.
Let n be the integer that is the code unit value for the character at position k within py.

最后,进行了比较:

If m < n, return true. Otherwise, return false.

这就是它与空间进行比较的方式。


简而言之,它将两个参数转换为它们的代码单元整数表示形式,并进行比较。


3
在 JavaScript 中,字符串按字母顺序进行比较。以下表达式为真:
 'abacus' <= 'calculator'
 'abacus' < 'abate'

然而 '#b' < '~a'。字母顺序并不能涵盖它。 - jazzpi

2

在大多数(如果不是全部)编程语言中,字符都是用数字来表示的。当您进行等于/大于/小于检查时,实际上检查的是底层数字。

因此,在JS中:

alert('c' > 'b'); // alerts true
alert('a' > 'b'); // alerts false

空格字符也有一个数字表示,因此检查是有效的。


但是,当你进入UTF-8区域时,情况就变得有些奇怪了,对吧?比较国际字母字符是可能的吗? - CMCDragonkai
一般来说,不行。仅比较代码点值(字符的数字表示)可能适用于某些语言和某些代码点子集,但通常Unicode字符串比较应使用Unicode排序建议(或更可能在实践中,找到一个语言特性或库按排序顺序进行比较)。@CMCDragonkai - Sundar R

1

[字符串] > [字符串] 将通过它们的代表值(参见ASCII表)来比较字符。


2
他正在询问关于 > 运算符。 - dlock
@dreadlock:谢谢 - 你是对的!我漏了那个。我会修改我的答案。 - simplyray

0

计算机将字符存储为一个数字(通常是一个或两个字节)。

每个字符都有一个独特的标识号码。

通过检查字符是否大于空格,实际上是在比较它们在表中的位置。

欲了解更多信息,请参见http://en.wikipedia.org/wiki/ASCII


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接