2008-05-07

Array.prototype.lastIndexOfのドキュメント不備?

mozilla developer centorのArray.prototype.lastIndexOfページで互換性の為に示しているJavaScriptコード(「互換コード」と呼ぶ)はFirefox(SpiderMonkeyは未確認)と完全互換と書いてありますがそうではないようです。indexOfメソッドを第二引数のfromIndexにNaNなど数値ではない値を指定して呼び出すと、Firefoxは0に置き換えて検索した結果を返しますが、互換コードは配列末尾から検索した結果を返します。
var a = [1, "0", NaN, 1];
a.lastIndexOf(1, null)); //Firefox:0、互換:0
a.lastIndexOf(1, void 0)); //Firefox:0、互換:3
a.lastIndexOf(1, NaN)); //Firefox:0、互換:3

問題は互換コードは値が数値ではない場合に配列の末尾から検索しているところで、ここを0を設定して検索するようにするのと、fromIndex引数の指定有無を確認する処理を入れてあげれば結果が同じになります。
保障しませんが参考までに勝手に直したコードを下記しておきます。
if (!Array.prototype.lastIndexOf)
{
Array.prototype.lastIndexOf = function(elt /*, from*/)
{
var len = this.length;

var from = arguments.length < 2
?len - 1
:Number(arguments[1]);
if (isNaN(from))
{
from = 0;
}
else
{
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
else if (from >= len)
from = len - 1;
}

for (; from > -1; from--)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}

実装とドキュメントに差異がある時は個人的に実装を正と考えるので、ドキュメントが誤っているのだと思っています。そのうち整理されればいいなぁ。

追記
蛇足ですがSafariのlastIndexOfメソッドは互換コードと同様の振る舞いをします。クロスブラウザ対応する場合は考慮する必要があります。

0 件のコメント: