🌀

Array.prototype[@@iterator] ←この @@ って何?

2021/01/10に公開

MDNにはたまにアットマークを2つ並べた @@ という記法が登場します。

Array.prototype[@@iterator]()

The @@iterator method is part of The iterable protocol, that defines how to synchronously iterate over a sequence of values.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/@@iterator

しかし、この記法をそのままJavaScriptやTypeScriptの処理系に入力しても構文エラーになります。

console.log(Array.prototype[@@iterator]());
// => Uncaught SyntaxError: Invalid or unexpected token

ではこの @@ はどこから来て、何を意味する記法なのでしょうか。

結論

これはドキュメント用のwell-known symbolsの略記法で、ECMAScriptの仕様の中で定義されています。

Within this specification a well-known symbol is referred to by using a notation of the form @@name, where "name" is one of the values listed in Table 1.

https://www.ecma-international.org/ecma-262/#sec-well-known-symbols

「仕様内で頻繁に参照するので、便宜的に略記法が導入されている」というだけで、JavaScriptというプログラミング言語の挙動とは関係ないわけですが、便利なのでMDNなど他の文書でも流用されているということのようです。

@@Symbol. に置き換えることで、だいたい動くコードになると考えてよさそうです。

console.log(Array.prototype[Symbol.iterator]());
// => Array Iterator {}

Discussion