在 JavaScript 中使用“<”和“>”运算符比较两个字符串

Aad*_*rma 3 javascript arrays string

当比较运算符的输入作为两个字符串值给出时,比较运算符><返回值。Boolean

我尝试了几个例子:

/* String vs String */
console.log('firstName' < 'lastname'); // true
console.log('firstName' < 'Firstname'); // false
console.log('!firstName' < 'lastname'); // true
console.log('!firstName' < 'Firstname'); // true
console.log('!firstName' < '!Firstname'); // false
console.log('!firstName' < '_!Firstname'); // true
console.log('@!firstName' < '_!Firstname'); // true
console.log('@!firstName' < '2_!Firstname'); // false

/* String vs Number */
console.log('@!firstName' < 2); // false
console.log('@!firstName' < -1); // false

/* String vs Special Numbers */
console.log('@!firstName' < Infinity); // false
console.log('@!firstName' < -Infinity); // false
console.log('@!firstName' < -Infinity + Infinity); // false

/* String vs NaN */
console.log('@!firstName' < NaN); // false
console.log(NaN.toString()); // "NaN"
console.log('@!firstName' < "NaN"); // true

/* String vs Arrays */
console.log('firstName' < [Infinity, -Infinity]); // false
console.log('firstName' < ['Firstname', Infinity, -Infinity]); // false
console.log('firstName' < ['2_Firstname', Infinity, -Infinity]); // false
Run Code Online (Sandbox Code Playgroud)

我真的很想知道 JavaScript 是如何真正评估这些表达式的。在上面的例子中,我发现这个是最令人着迷的console.log('@!firstName' < Infinity); // false

所以,我的问题是:

在这些场景中,如何使用JavaScript 中的“大于”和“小于”运算符进行比较(来自上面的示例):

  1. 字符串与字符串,
  2. 字符串与数字,
  3. 字符串与特殊数字,
  4. 字符串与 NaN,
  5. 字符串与数组

geo*_*org 5

如上所述,正式规范在标准中:http://www.ecma-international.org/ecma-262/7.0/#sec-abstract-relational-comparison,通俗地说逻辑是这样的:

\n\n

1)字符串与字符串

\n\n

将两个字符串拆分为 16 位代码单元并进行数值比较。请注意,代码单元!=字符,例如"cafe\xcc\x80" < "caf\xc3\xa8"true(真的)。

\n\n

2) 字符串与其他原语

\n\n

将两者都转换为数字。如果其中之一是NaN,则返回false,否则进行数值比较。+0并且-0被认为是平等的,+/-Infinity比其他任何东西都大/小。

\n\n

3)字符串与对象

\n\n

尝试将对象转换为原始对象,依次尝试[Symbol.toPrimitive]("number")valueOftoString。如果我们有字符串,则继续 1),否则继续 2)。特别是对于数组,这将调用toString与 相同的which join

\n