4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2012-08-06

##対象
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 という素直な名前のメソッドで事は足りる。
  1. グローバル汚染のひどいライブラリを選ぶのは極力避けるべき。
  • 特に組み込みオブジェクトを拡張するようなものには細心の注意を。
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?