Давайте погрузимся в спецификацию ECMA. Я включил номера разделов, чтобы вы могли ссылаться.
11.8.2 Оператор большего чем (>)
Производство RelationalExpression: RelationalExpression>
ShiftExpression оценивается следующим образом:
- Пусть lref будет результатом вычисления RelationalExpression.
- Пусть lval будет GetValue (lref).
- Пусть rref будет результатом вычисления ShiftExpression.
- Пусть rval будет GetValue (rref).
- Пусть r будет результатом выполнения абстрактного реляционного сравнения rval
Важной частью этого является Абстрактное реляционное сравнение . Который определяется:
11.8.5 Абстрактный алгоритм реляционного сравнения
Функция toPrimitive
сначала будет вызываться для Объектов. Несмотря на то, что это склонно возвращать числа, если это возможно, строки также могут быть получены. Как только это произойдет, будет рассмотрено следующее:
а. Если py является префиксом px, верните false. (Строковое значение p является префиксом строкового значения q, если q может быть
результат конкатенации p и некоторой другой строки r. Обратите внимание, что любой
Строка сама по себе является префиксом, поскольку r может быть пустой строкой.)
б. Если px является префиксом py, верните true.
с. Пусть k будет наименьшим неотрицательным целым числом таким, что символ в позиции k в пределах px отличается от символа в позиции k в пределах py . (Должно быть такое k, поскольку ни одна строка не является префиксом другой.)
д. Пусть m будет целым числом, которое является значением единицы кода для символа в позиции k в пределах px. е. Пусть n будет целым числом, которое является значением единицы кода для символа в позиции k в пределах py. е. Если m
Это означает, что будет проверен первый символ в строке, отличный от другого. Как было отмечено Esailija, функция IE toString()
возвращает немного отличную строку от других браузеров, что приводит к другому сравнению.
Это различие между браузерами, кажется, является действительным, как указано здесь:
15.2.4.4 Object.prototype.valueOf ()
Когда вызывается метод valueOf, предпринимаются следующие шаги:
- Пусть O будет результатом вызова ToObject с передачей значения this в качестве аргумента.
- Если O является результатом вызова конструктора Object с хост-объектом (15.2.2.1), тогда a. Вернуть либо O, либо другое значение, например
Хост-объект изначально передан в конструктор. Конкретные
возвращаемый результат определяется реализацией.
- Возврат О.