String.prototype.match の返り値が IE8 だけ異なる


JavaScript の String.prototype.match で、マッチしなかった () の値が IE だけ異なる。

// foo または数字にマッチし、数字だったら後方参照したい
pattern = /foo|(\d+)/;

// () にマッチする場合は期待通り
number = "123";
number.match(pattern); // ["123", "123"]

// () にマッチしない場合は IE だけ異なる
text = "foo";
text.match(pattern);
// ["foo", undefined] (Chrome 23, Safari 6, Firefox 17, Opera 12, IE9)
// ["foo", ""] (IE8)

IE10 は環境が手元にないので未検証。
ECMAScript 3 / 5 では undefined になるのが正しい挙動 (コメント参照) で、IE8 の挙動がおかしい。