"aaa".match(/regexp/) == ?

JavaScript正規表現マッチをする関数は Stringオブジェクトの match(regexp) な訳ですが、これの戻り値は (null or マッチした文字列)かと思ってた*1ら違うみたいですね。昨日のグリモン作るときに使って気づきました。
gオプションの有無やブラウザによっても微妙に違うみたいなので、メモ代わりにまとめてみます。

gオプションなしの場合
var m = "aabbcc".match(/a(b+|(c+))/);
プロパティ 内容 IE6.0 Firefox2.0 Opera9.0.2
m.input 入力した文字列 "aaabbbaabb"
m.index マッチした箇所のインデックス 1
m.lastIndex マッチした箇所の末尾のインデックス 4 undefined undefined
m.length 正規表現のグループ個数 + 1 3
m[0] マッチした文字列全体 "abb"
m[1] マッチの前方参照(RegExp.$1と同じ) "bb"
m[2] マッチの前方参照(RegExp.$2と同じ) "" undefined

lastIndexがFirefoxOperaにありませんし、ORパターン('|')で評価されなかったほうが空文字列かundefinedかで違うのは微妙ですね。
前方参照グループが[n]で参照できるのは覚えておくといいかも。

gオプションありの場合
var m = "aabbaacc".match(/a(b+|(c+))/g);
プロパティ 内容 IE6.0 Firefox2.0 Opera9.0.2
m.input 入力した文字列 "aaabbbaabb" undefined undefined
m.index マッチした箇所のインデックス 5 undefined undefined
m.lastIndex マッチした箇所の末尾のインデックス 8 undefined undefined
m.length 正規表現がマッチした回数 2
m[0] 1回目にマッチした文字列全体 "abb"
m[1] 2回目にマッチした文字列全体 "acc"

IE以外では、単純に繰り返しマッチで、マッチした箇所を格納した配列になっています。IEは最後にマッチしたときのinput, index, lastIndexが参照できます。

gオプションがどっちでもオブジェクトの型は Array です。なので、indexOf とか、 sort とか呼び出せます。sortは意味無いと思いますけど。

*1:僕のJavaScriptの知識ベースはとほほのJavaScriptリファレンスなわけで、正規表現(RegExp)をそのまま信じていたわけです。