0
0

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 3 years have passed since last update.

【JavaScript】反復処理⑧ イテレーターとスプレッド演算子

Last updated at Posted at 2021-11-15

#はじめに

Udemyの【JS】ガチで学びたい人のためのJavaScriptメカニズムの講座の振り返りです。

前回の記事

#目的

  • 反復処理についての理解を深める

#本題
###1. スプレッド演算子

  • スプレッド演算子とは反復可能や列挙可能オブジェクトの展開を行う演算子のこと。
  • 主に配列で使用。[...]のように記述する
  • 関数の引数で使用された場合,残余引数と呼ばれ、実引数に渡された変数を配列にまとめる。
    • レストパラメーター ex. function(...args)
  • スプレッド演算子は イテレーターの操作に従う

####例1

スプレッド演算子の基本的な使い方

// 配列を準備
const array1 = [1,2,3,4,5];
// スプレッド演算子によって展開されたものが再度array2に格納される(新しい配列を作っている)
const array2 = [...array1];
// (5) [1, 2, 3, 4, 5]と出力
console.log(array2);
// array1とarray2は別の配列となっている
console.log(array1 === array2);
// falseと出力される
// 先頭に0を足したり、後方に6番目を追加したりして直感的に配列を動かせる
const array3 = [0,...array1, 6]
// (7) [0, 1, 2, 3, 4, 5, 6] と出力
console.log(array3);

####例2

レストパラメーターの用途

// 関数を一つ定義し、引数にレストパラメーターを持たせる
// 渡ってきた引数を...argsの配列にまとめる
function sum(...args){
  // 初期値を設定
  let ret = 0;
  // for...ofで渡ってきた配列の値を一つひとつ抽出
  for(let v of args){
    // 1~4がvに格納されていることわかる
    // console.log(v);
    // ret + vが繰り返される
    ret += v;
  }
  // sumに値を返却する
  return ret;
}
// 引数に渡す値
const result = sum(1,2,3,4);
// 10と出力される
console.log(result);

####例3

イテレーターの関係性

// ジェネレーターを利用して反復可能オブジェクト化
Object.prototype[Symbol.iterator] = function* (){
  for(let key in this){
    yield[key, this[key]];
  }
}

####例4

// オブジェクトを用意
const obj1 = {
  prop1: "value1",
  prop2: "value2",
  prop3: "value3"
}
// Uncaught TypeError: obj1 is not iterableと出力される
// このオブジェクトは反復可能オブジェクトではないという意味
const array4 = [...obj1];

上記エラーを無くすのにイテレーター(ジェネレーター)を使用

// オブジェクトを用意
const obj1 = {
  prop1: "value1",
  prop2: "value2",
  prop3: "value3"
}

// ジェネレーターを利用して反復可能オブジェクト化
Object.prototype[Symbol.iterator] = function* (){
  for(let key in this){
    yield[key, this[key]];
  }
}

const array4 = [...obj1];
// 配列で出力される
console.log(array4)

オブジェクトのリテラルで囲うと挙動が変わる

const obj1 = {
  prop1: "value1",
  prop2: "value2",
  prop3: "value3"
}

Object.prototype[Symbol.iterator] = function* (){
  for(let key in this){
    yield[key, this[key]];
  }
}

  // {}で囲う
const array4 = {...obj1};
// {prop1: 'value1', prop2: 'value2', prop3: 'value3'}と出力される
// これはジェネレーターを通さずに、obj1がそのまま出力されている
console.log(array4)

今日はここまで!

#参考にさせて頂いた記事

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?