比较运算符如何在javascript中处理字符串数据类型

时间:2017-09-19 19:32:24

标签: javascript

var a = 'abcdefg';
var b = 'abczefg';

// false
a > b

Javascirpt引擎如何使用上面的代码。它比较每个字母吗? 我很想知道代码是否会在遇到' z'并返回false或者直到结束才进行比较,然后返回false?

3 个答案:

答案 0 :(得分:0)

从标准中,未提及任何实施:

  

7.2.12 Abstract Relational Comparison

     

字符串的比较在代码单元值序列上使用简单的字典顺序。没有尝试使用Unicode规范中定义的字符或字符串相等和整理顺序的更复杂,语义导向的定义。因此,根据Unicode标准规范相等的字符串值可以测试为不相等。实际上,该算法假设两个字符串已经处于规范化形式。另请注意,对于包含增补字符的字符串,UTF-16代码单元值序列的字典顺序与代码点值序列的字典顺序不同。

实施是特定于供应商的。

答案 1 :(得分:0)

Javascript规范只描述了比较运算符的抽象行为,而不是它们的实现。所以任何理论上都是可能的,只要它能产生正确的结果。

但是,在返回答案之前循环遍历整个字符串的任何实现都将是非常愚蠢的。想象一下两个百万字符的字符串,它们的第一个字符不同 - 没有充分的理由来比较所有剩余的字符,因为它们对结果没有影响。

它可能无法完全按字符比较,因为可能有机器操作一次对单词进行操作,但是看到一个实现不会停止在第一个差异的几个字节内进行比较将是非常令人惊讶的

答案 2 :(得分:0)

我可以在规范中加入最深入的内容,它说localeCompare这可能与您所寻找的类似:

  

21.1.3.10 String.prototype.localeCompare

     

以实现定义的方式比较两个字符串。结果旨在按主机默认语言环境指定的排序顺序对字符串值进行排序,并且将为负数,零或正数,具体取决于S在排序顺序中是否在此之前,字符串是否相等,或者S是否在之后分别在排序顺序中。

实施不能具体,以及他们对此的看法:

  

实际返回值是实现定义的,允许实现者在值中编码其他信息,但需要该函数来定义所有字符串的总排序。此函数必须将根据Unicode标准规范等效的字符串视为相同,并且在比较被视为规范等效的字符串时必须返回0。

我们可以肯定的是,它可以依赖于默认语言环境而不仅仅是字符比较运算符。尽管如此,为了回答你的一个问题,是的,每当找到一个更大的字符时,算法就会停止,因为一旦字符串变大,它就不能在之后变得相等或更小(但是我可能错了,如果有人发现了一个场景,它发生在特定的区域设置,我很乐意更新我的答案)。但是,迭代的方向可以是LTR(从左到右)或RTL(从右到左),具体取决于您的语言环境,因此正确的实现也应该关注它。