По моим тестам он всегда слева направо
>> 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
.- Пусть
arg
beGetValue(ref)
.- Возвращает список, длина которого больше, чем длина
precedingArgs
и чьими элементами являются элементыprecedingArgs
, в порядок, а затем в концеarg
, который является последним элементом нового список.
Читайте здесь: http://es5.github.com/#x11.2.4
При вызове функции аргументы передаются слева направо.
Для исторического интереса см. также раздел 4.2 Порядок оценки JavaScript 1.1. Спецификация языка (Брендан Эих, C. Rand Mckinney, 11/18/96).
В вызове функции или конструктора одно или несколько выражений аргументов могут появляться в круглых скобках, разделенных запятыми. Каждый аргумент выражение полностью оценивается перед любой частью любого аргумента выражение справа от него.