Is it the spread operator or spread syntax?

# Andrew Li (7 years ago)

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?

# T.J. Crowder (7 years ago)

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

# Andrew Li (7 years ago)

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.

# Allen Wirfs-Brock (7 years ago)

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.