Posted by & filed under いろいろ.


Rhinoにfor-of追加パッチを投げました。
https://github.com/mozilla/rhino/pull/100

for-ofって何?

配列や文字列をループで列挙する構文で、Javaの拡張forみたいに最近の言語なら大抵あるやつです。
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for…of
http://wiki.ecmascript.org/doku.php?id=harmony:iterators

for-inとなにが違うの?

for-inはオブジェクトの値ではなくプロパティ名を列挙します。他にも色々落とし穴があるので配列に対して使うべきではないでしょう。
http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml#for-in_loop

for each-inとなにが違うの?

for each-inは値を列挙しますが順序を保証しません。例えばRhinoで最適化オプションを0にしてこんなコードを書くとわかります。

$ java -jar js.jar
Rhino 1.7 release 4 2012 06 18
js> var a = Array(10001);
js> a[2] = '22';
js> a[0] = '00';
js> a[1] = '11';
js> for each (var n in a) print(n);
22
00
11

他にもこんな違いがあります。

  • 疎な配列のときにfor each-inは値が入ってないインデックスを列挙しない(for-ofはする)
  • for each-inはenumerable: falseなプロパティを列挙しない(for-ofはする)
  • for each-inは数値以外のプロパティも列挙する(for-ofはしない)

for each-inはE4Xのために作られた構文なので、E4XがDeprecatedな現状では使うべきではないでしょう。
https://developer.mozilla.org/en/docs/JavaScript/Reference/Statements/for_each…in

ofなんて予約語増やして大丈夫なの?

ofは予約後ではないので変数名などの識別子として使えます。ECMAScript4の失敗からか互換性に気を遣っていることが窺えます。

java.util.Iteratorでもfor-ofしたい!

for-in Iteratorを使いましょう。

var a = java.util.ArrayList();
js> a.add(11);
js> a.add(22);
js> for (var n in Iterator(a)) print(n);
11.0
22.0

Nashornになんでfor each-inがあるの?

いい加減E4Xは静かに眠らせてやれよ。


関連文書:

  • 関連文書は見つからんがな

Comments are closed.