[1,2,3].x(2) -> [1,2,3,1,2,3]

id:reinyannyan:20060427:p1 で、写真の額縁をランダムに五つ並べる、ということを表そうとしたんですが、

['random', 'random', 'random', 'random', 'random']

と書くのはあまりに格好悪いなと思いました。そこで、Ruby の配列の乗算メソッド (*) と同様のものを "x" として実装してみました。

Array.prototype.x = function (x) {
  if (isNaN(x)) return this.join(x);

  var result = [];
  while (x-- > 0)
    result.push.apply(result, this);
  return result;
};

引数が文字列の場合 (例では、数値でなかった場合) は join する、という挙動は Ruby に倣っています。

push.apply というややトリッキーなことをしていますが、単純に push すると、

[1,2,3,[1,2,3]]

という状態になってしまいますので、apply を使って展開する必要があるのです。「concat 使えば?」:

result = result.concat(this);

と思うところなんですが、計測の結果 push の方が圧倒的に速かったため、速い方を使いました。