По моим тестам он всегда слева направо
>> console.log( console.log(1), console.log(2) );
1
2
undefined undefined
но я не могу найти соответствующий раздел, подтверждающий это в стандарте ECMAScript.
По моим тестам он всегда слева направо
>> console.log( console.log(1), console.log(2) );
1
2
undefined undefined
но я не могу найти соответствующий раздел, подтверждающий это в стандарте ECMAScript.
Все операторы JavaScript оценивают свои операнды слева направо, включая оператор вызова функции. Сначала функция для вызова оценивается по фактическим параметрам в порядке слева направо.
Раздел 11.2.3 - это соответствующий раздел спецификации.
11.2.3 Вызовы функций
...
2 Пусть func будет GetValue (ref).
3 Пусть argList является результатом вычисления аргументов, создавая внутренний список значений аргументов (см. 11.2.4).
...
и вы можете видеть, что производство ArgumentList является леворекурсивным
11.2.4 Списки аргументов
...
Произведение ArgumentList: ArgumentList
,AssignmentExpression оценивается следующим образом
и ArgumentList оценивается до выражения AssignmentExpression в следующей формулировке.
В EcmaScript 3 некоторые из операторов сравнения (<, <=, >, >=) оценивались справа налево, так как a<=b был определен в терминах !(b<a), но это было широко признано как ошибка спецификации, основные интерпретаторы не реализовали ее таким образом, и она была исправлена в EcmaScript 5.
Из спецификации языка:
11.8.5 Алгоритм анализа реляционных сравнений # Ⓣ
Сравнение
x < y, гдеxиy- значения, выдаетtrue,falseилиundefined(что указывает, что хотя бы один операндNaN). В дополнение кxиyалгоритм берет в качестве параметра булевский флаг с именем LeftFirst. Флаг используется для управления порядком, в котором операции с потенциально видимыми побочными эффектами выполняются наxиy. Это необходимо, потому что ECMAScript определяет оценку выражений слева направо. Значение по умолчанию LeftFirst равно true и указывает, что параметрxсоответствует выражению, которое находится слева от параметровyсоответствующее выражение. Если LeftFirst является ложным, обратное - это случай, и операции должны выполняться сyдоx. Такое сравнение выполняется следующим образом:
Он определен здесь:
Производством
ArgumentList : ArgumentList , AssignmentExpressionявляется оценивается следующим образом:
- Пусть
precedingArgsбудет результатом оценкиArgumentList.- Пусть
refбудет результатом оценкиAssignmentExpression.- Пусть
argbeGetValue(ref).- Возвращает список, длина которого больше, чем длина
precedingArgsи чьими элементами являются элементыprecedingArgs, в порядок, а затем в концеarg, который является последним элементом нового список.
Читайте здесь: http://es5.github.com/#x11.2.4
При вызове функции аргументы передаются слева направо.
Для исторического интереса см. также раздел 4.2 Порядок оценки JavaScript 1.1. Спецификация языка (Брендан Эих, C. Rand Mckinney, 11/18/96).
В вызове функции или конструктора одно или несколько выражений аргументов могут появляться в круглых скобках, разделенных запятыми. Каждый аргумент выражение полностью оценивается перед любой частью любого аргумента выражение справа от него.