私は最近、JS 配列プロトタイプにいくつかの拡張機能を書きました。
Array.prototype.diff = function (a) {
return this.filter(function (i) {
return !(a.indexOf(i) > -1);
});
};
Array.prototype.udiff = function (a, b) {
var rslt = this.concat(b);
return rslt.filter(function (i) {
return !(a.indexOf(i) > -1);
});
};
そこには何もひどく刺激的ではありません。しかし、その後、私は非常に珍しいことに遭遇しました。ここに例があります
var arr = [];
for (prop in arr) {
arr[prop].attrib = arr[prop].attrib.replaceAll('_', ' ', true);
}
非常に無害に見えるコードですが、「未定義にはメソッドreplaceAllがありません-replaceAllは私自身のString.prototype拡張です.
解決策は簡単です - arr[prop] を操作する前に発行するだけです
if ('string' == typeof(prop)) continue;
その理由は、 prop もdiffまたはudiffになる可能性があるためです。それで、問題は解決しましたが、この振る舞いは私を油断させ、追加の typeof テストを行わなければならないのは不器用に聞こえます。おそらく、ここにいる誰かが、プロトタイプ拡張機能で何が起こるかについて、より深い洞察を持っているでしょうか?
これらの問題はすべて、Windows 上の Chrome で発生したことに注意してください。