Prototype.js の reduce メソッドを使ってはいけない

More than 5 years have passed since last update.


対象

1.6.0.3 以前のバージョンの Prototype.js を対象とする。

1.6.1 以降では取り除かれている。


理由


  • 標準の Array.prototype.reduce と互換性が無いため

  • そもそもメソッドの仕様が邪悪なため


reduce について

Array.prototype.reduce は ECMAScript 5 あるいは JavaScript 1.8 から利用可能なメソッドで、配列(など)を簡約するためのもの。2012 年の現在では各種モダンブラウザや node.js などでも利用することができる。


[1, 2, 3].reduce(function(a, b){ return a + b });// 6


古い Prototype.js の reduce

ソースコードを抜粋する。


reduce: function() {
return this.length > 1 ? this : this[0];
},

見てのとおり要素の個数によって戻り値の型が変わる。


[1, 2, 3].reduce();// [1, 2, 3]
[1].reduce();// 1

つまり Array[A] なのか A なのかが定まらない。

この二つの型を同一視したい場合としては、たとえば Array[Array[Array[...]]] のように「要素の個数が 1 で且つ多重にネストされた」配列などが考えられるが、通常まずそんな状況はない。


まとめ

1) Prototype.js 利用環境で


  • reduce を「配列から最初の要素を取得する」ために呼ぶのは誤り。


    • 要素が二個以上に増えた場合に動作が壊れる。

    • その場合は first という素直な名前のメソッドで事は足りる。



2) グローバル汚染のひどいライブラリを選ぶのは極力避けるべき。


  • 特に組み込みオブジェクトを拡張するようなものには細心の注意を。