17

I was wondering if there was a specific difference in implementing an iterator using the @@iterator function versus the Symbol.iterator one:

On MDN, there is a page on Array.prototype.@@iterator, yet in the examples itself, Symbol.iterator is used as the function name. Is this just the updated version and @@iterator is not valid anymore, or are both of them valid?

nils
  • 25,734
  • 5
  • 70
  • 79

2 Answers2

11

There is no @@iterator function. That token produces a syntax error - it is only used in specification to denote a specific symbol.

If you want to use that symbol in your code, e.g. to access iterators on arrays, you have to use Symbol.iterator. Which is a property of the Symbol class initialised to have the value @@iterator.

Community
  • 1
  • 1
Bergi
  • 630,263
  • 148
  • 957
  • 1,375
11

The ECMAScript 2015 (ES6) specification uses @@iterator to reference Symbol.iterator. There is no @@iterator, and wherever you see it, read it as Symbol.iterator.

I think (someone more familiar with the ECMAScript spec might be able to back this up) the reason @@iterator is used is because you need to access Symbol properties on an object using square brackets ([]), but most parts of the ES2015 specification (and documentation) used the more familiar dot-notion (e.g. object.property versus object["property"]), and so@@somesymbol` is used to keep things consistent.

See page 38 (marked as page 18): http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Thomas Foster
  • 1,303
  • 1
  • 10
  • 23