Promise.all/raceの引数が謎な件について


[Typy.Promise](https://github.com/k-maru/TypyPromise)っていうPromiseの実装を車輪の再発明よろしく作ってみました。npmとbowerにあげてます。なんでこんなの作ったのかというと、作ってみたかったっていうのが一番の理由です。他意はないです。はい。
作るときにできる限り忠実に作りたいなぁと思って、読めない英語を感で適当に斜めに、イメージしながら読んで、ChromeとかFirefoxとかSafariとかを動かしながら作ってます。この間書いた[JavaScript Promiseの実行順序(Firefox31とChrome37で違うけどどっちが正しい？)](http://qiita.com/k_maru/items/50eeaa16a75503690114)ってのもその副産物です。
で、今日の内容も謎があったのでどないなん？ってところです。ちなみに大いに嘘が書かれてるかもしれないことはあらかじめご承知おきを。

Promise.all/raceの引数はiterable
-------------------------------
[仕様](http://people.mozilla.org/%7Ejorendorff/es6-draft.html#sec-promise-objects)をみるとPromise.all/raceの引数はどうやらiterableなオブジェクトみたいです。直リンクが貼れなかったのですが、リンク先の25.4.4.1とか25.4.4.3とかに書いてます。iterableってなんすか？ってことで、まぁ、予想的にはfor..ofでくるくる回せるやつかなぁ。ってところなんですが、仕様読んでると[GetIterator](http://people.mozilla.org/%7Ejorendorff/es6-draft.html#sec-getiterator)ってのがあるので、中見てみます。で、さらに読み進めると[CheckIterable](http://people.mozilla.org/%7Ejorendorff/es6-draft.html#sec-checkiterable)ってのがあってどうやらこいつが確信っぽいです。

CheckIterable
-------------
[CheckIterable](http://people.mozilla.org/%7Ejorendorff/es6-draft.html#sec-checkiterable)をみると、iterableかどうかは以下のように判断しろみたいな感じですかね。
 
1. 値がobjectかどうか判断して、そうでなかったらiterableではない
2. @@iteratorプロパティがあったらiterable。そうでなかったら、iterableじゃない。

というらしいです。いやいやいや、@@ieratorってどうやって取るのさ!? 

![スクリーンショット 2014-11-18 23.02.07.png](https://qiita-image-store.s3.amazonaws.com/0/16028/2f130f83-770f-a235-ac73-1a9afc56c541.png "スクリーンショット 2014-11-18 23.02.07.png")

あっ、いけた。。。。いやいやいやいや。いいのか Firefox!?これ内部プロパティじゃないんすか？？ちなみにChromeではダメでした。(実装されててダメなのか、実装されてないのかは不明)

@@iteratorはどんなオブジェクトに実装されてるのか
-----------------------------------------
ということで、疑問は次なる段階に進んで、じゃ、@@iteratorってどんなのに実装されてるのよって思ったわけです。MDNでiterableを見てみると[こんな感じ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/iterable#Builtin_iterables)。StringとかArrayとかMapとかSetとかにあるみたいです。Generatorはひとまず置いとくとします。

![スクリーンショット 2014-11-18 23.23.04.png](https://qiita-image-store.s3.amazonaws.com/0/16028/cf99680e-2111-25f1-fd81-191a9412f298.png "スクリーンショット 2014-11-18 23.23.04.png")

確かにいけてますね。オブジェクトでもなんか返ってきてるのは、とりあえずは置いときます。

StringがiterableならPromise.all/raceに渡したときにどうなるのか？
-------------------------------
やっと本題。StringがiterableならPromise.all("hoge")とかPromise.race("fuga")ってしたときにどういう動きをするのかの疑問が湧きました。仕様をちゃんと読めば書いてあるのかもしれないですが、英語よくわかりません。
直感的には、渡された引数がPromiseで無くって、thenableでもない場合は、Promise.resolveされてPromiseに変換された内容を使いそうな気がするので、Promise.resolve("hoge")みたいな感じなのかなと思うのですが、でもStringはiterableなので、一文字づつPromise.resolveされるようにも思えます。

```js
Promise.all("hoge");
↓
Promise.all([
  Promise.resolve("h"),
  Promise.resolve("o"),
  Promise.resolve("g"),
  Promise.resolve("e")
]);
```

みたいな。で、とりあえずやってみようってことでFirefoxでやってみました。

![スクリーンショット 2014-11-18 23.40.05.png](https://qiita-image-store.s3.amazonaws.com/0/16028/7b8159e6-f05f-e745-8c03-e68155cfc3f5.png "スクリーンショット 2014-11-18 23.40.05.png")

ある意味で、そらそうか。って感じです。が、Stringはiterableやのになんで動かへんねん。っていう疑問もあります。いや、動かれると非常に気持ち悪いので動いてくれないほうがいいのはいいのですが。

と、いうことでとりあえず怒られます。

続いて、Setやったらどうやろうって思って試してみます。

![スクリーンショット 2014-11-18 23.46.23.png](https://qiita-image-store.s3.amazonaws.com/0/16028/914190d5-669b-15c3-0665-29a7a3606484.png "スクリーンショット 2014-11-18 23.46.23.png")

うん。キーのほうが戻ってきてますね。個人的には値のほうが欲しいのですが。もしくはタブルみたいな感じで両方ともか。ちなみにChromeでは動きません。

結論
----
よくわからんので、もうちょい調べる。とりあえず、iterator周りからかな。