Is it the spread operator or spread syntax?
You're not alone in this question; early on, lots of folks called ...
an
operator. It isn't. Rest and spread are syntax, just like the commas in a
function's parameter declaration list are syntax, not the comma operator.
What rest and spread do is outside the realm of what an operator can do. An
operator has a single result value which is (optionally) used where the
operator's expression was once the expression has been evaluated. E.g., in
foo(2 * 5)
, the 2 * 5
is evaluated and the resulting value (10
) is
passed into foo
as the first argument. Roughly speaking, operators are
built-in functions with A) optionally-symbolic names, B) infix notation
(for binary and ternary operators), and C) lazy argument evaluation; and
like functions, they have only a single result value (and potential
side-effects). Rest and spread can't be expressed that way. Consider
foo(...a)
. There's no single result value there, there's a series of
discrete values used as discrete arguments to foo
.
-- T.J. Crowder
I hadn't though about rest and how it passes multiple values to a function -- so it's definitely not an operator. I would say that since spread/rest syntax doesn't always evaluate to exactly one value, is context-specific (you can't use it standalone), and isn't defined as an operator in the ECMAScript spec with productions only ever containing literally ..., I can say definitively that it's not an operator.
An element of a programming that has its own distinct syntax rules is sometimes called a “special form”. So … can be called a special form. Or you can think of it as an syntactic element of argument lists, parameter lists, array literals/destructuring, object literals/destructuring, each of which is itself a special form.
It seems as if there's two different ways to refer to the ... punctuator. How should I refer to this:
const foo = [bar, ...baz];
MDN seems to suggest it's referred to as 'spread syntax' but its article URL seems to suggest it was initially created under the name 'spread operator' -- and it's more popular when looking at Google results. Syntax is the 'form' of the language while operators are generally used to perform a certain operation on a number of operands to produce a value.
It seems as if on the surface, 'operator' is the most appropriate fit here, as it's seems more like a prefix unary operator more than it is syntax. But in the context of ECMAScript, it's not listed as an operator at MDN nor explicitly in the language specification -- and it's more of an extension of array literal syntax and only works in context of array literals. I would say it's more appropriately named syntax due to that, in the language specification, it's only ever mentioned literally in the ArgumentList and SpreadELement productions. That seems to suggest it's more just syntax rather than a standalone operator such as + or *.
Which way of referring to it would be more 'correct' if any and is my reasoning correct?