All the operators in JavaScript evaluate their operands left-to-right, including the function call operator. First the function to call is evaluated then the actual parameters in left-to-right order.
Section 11.2.3 is the relevant spec section.
11.2.3 Function Calls
…
2 Let func be GetValue(ref).
3 Let argList be the result of evaluating Arguments, producing an internal list of argument values (see 11.2.4).
…
and you can see that the ArgumentList production is left-recursive
11.2.4 Argument lists
…
The production ArgumentList : ArgumentList
,
AssignmentExpression is evaluated as follows
and ArgumentList is evaluated before AssignmentExpression in the following verbiage..
Under EcmaScript 3 some of the comparison operators (<
, <=
, >
, >=
) evaluated right to left since a<=b
was defined in terms of !(b<a)
, but that was widely recognized as a spec error, major interpreters did not implement it that way, and it was fixed in EcmaScript 5.
From the language spec:
11.8.5 The Abstract Relational Comparison Algorithm # Ⓣ
The comparison
x < y
, wherex
andy
are values, producestrue
,false
, orundefined
(which indicates that at least one operand isNaN
). In addition tox
andy
the algorithm takes a Boolean flag named LeftFirst as a parameter. The flag is used to control the order in which operations with potentially visible side-effects are performed uponx
andy
. It is necessary because ECMAScript specifies left to right evaluation of expressions. The default value of LeftFirst is true and indicates that thex
parameter corresponds to an expression that occurs to the left of they
parameter’s corresponding expression. If LeftFirst is false, the reverse is the case and operations must be performed upony
beforex
. Such a comparison is performed as follows: