JavaScriptでもPythonみたく`range()`したい!

公開日:2019-06-26
最終更新:2019-06-26

はじめに

for i in range(10):  
  print(i)  
  # かっこいい  

理屈はいいから早く見せろ!

/**  
 * @param  {...number} args  
 */  
const range = (...args) => {  
  function* rangeGen(from = 0, to = Infinity, step = 1) {  
    for (let v = from; v < to; v += step) {  
      yield v;  
    }  
  };  

  return args.length === 0  
    ? rangeGen(undefined, undefined, undefined)  
    : args.length === 1  
    ? rangeGen(undefined, args[0], undefined)  
    : args.length === 2  
    ? rangeGen(args[0], args[1], undefined)  
    : rangeGen(...args);  
}  

for (const v of range(2, 10)) {  
  console.log(v);  
  // 2 ~ 9までが順番に出力される  
}  

何やってんだよ???

range関数はジェネレータ関数を実行した結果を返します。引数をジェネレータ関数に振り分けるだけのラッパーです。
rangeGenがジェネレータ関数です。

  1. ジェネレータってなんだよ
    • ES2015で追加されたJavaScriptの比較的新しい機能です
  2. 何をジェネレートすんだよ
    • 反復可能オブジェクトをジェネレートします
  3. 反復ってなんだよ
    • for-of
    • スプレッド構文(...iterator)
    • 分割代入(const [hoge, huga] = iterator;)
    • とかです。多分
  4. 配列じゃだめなの?
    • 無限を扱えます

詳しいジェネレータ関数の使い方は、各位ググるなりMDN読むなりしてください。

とりあえずここでは、fromからtoまでの数字を列挙することのできるやつを作っています。

おわりに

これでJavaScriptでもfor (const i of range()) {できます。

記事が少しでもいいなと思ったらクラップを送ってみよう!
6
+1
@okayuの大して技術的ではないブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする