WebアプリのメインJavaScriptに次のコードがあります。
// uniq for arrays
if (!Array.prototype.getUnique) {
Array.prototype.getUnique = function () {
var u = {}, a = [];
for (var i = 0, l = this.length; i < l; ++i) {
if (u.hasOwnProperty(this[i])) {
continue;
}
a.push(this[i]);
u[this[i]] = 1;
}
return a;
}
}
これはjavascriptの単純なuniq
クローンであり、基本的なArrayクラスにmonkeypatchedされています。(モンキーパッチについて議論するためにここにいるのではなく、他の場所で炎を上げてください...)
getUnique()
意図したとおりに機能しますが、ループを使用して配列を反復処理するたびに、for...in
呼び出される追加のインデックスgetUnique
がイテレータ本体に渡され、このfalsen
が検索されると、getUnique
のコードが値になります。(言い換えるfor...in
と、配列をループしているはずですがgetUnique
、最後の反復としてaを追加しています)
ここで何が起こっているのですか?この関数のすぐ上に、正常に機能し(indexOf()
)、イテレータに表示されない別の関数があります。この問題を引き起こすいくつかのサンプルコードを次に示します。
for (var r in result) {
//tags = tags + result[r]["tags"].split(" ").join(", ")
if (result[r]["tags"]) {
var newtags = result[r]["tags"].split(" ");
debug.log(newtags);
for (var n in newtags) {
debug.log("n is " + n);
tags.push(newtags[n]);
}
}
}
このスニペットからのデバッグ出力は次のようになります。
[14:22:26.090] [["camp", "furnitur", "wood"]]
[14:22:26.093] ["n is 0"]
[14:22:26.096] ["n is 1"]
[14:22:26.099] ["n is 2"]
[14:22:26.101] ["n is getUnique"]
ここで何が起こっているのですか?モンキーパッチをリファクタリングしてユーティリティクラスにドロップするのは簡単ですが、これは私にとって本当に奇妙なエッジケースです。私はここで何が起こっているかについて頭の中でいくつかの考えを持っていますが、それらは単なる推測です。誰か説明できますか?