[JavaScript]分割代入とスプレッド構文の問題を作ってみました

記事の概要

はじめまして。ネットオンで開発エンジニアをしている竹田と言います。

今回は私が現場でJavaScriptのソースコードに触れてみて辛かった「分割代入」と「スプレッド構文+残余引数について自分の理解度を深めてみようと思います。

目的

分割代入とスプレッド構文の問題を解くことで理解を深める。

この記事はこういう方にオススメ

分割代入とスプレッド構文を読み慣れていない方。

分割代入とは?

分割代入 (Destructuring assignment) 構文は、配列から値を取り出して、あるいはオブジェクトからプロパティを取り出して別個の変数に代入することを可能にする JavaScript の式です。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

関数の返値が「オブジェクト」や「配列」である時に、関数側に変更を加えず返値を受け取る側で使いやすい形する目的で使われることが多いです。

スプレッド構文とは?

スプレッド構文 (...) を使うと、配列式や文字列などの反復可能オブジェクトを、0 個以上の引数 (関数呼び出しの場合) や要素 (配列リテラルの場合) を期待された場所で展開したり、オブジェクト式を、0 個以上のキーと値の組 (オブジェクトリテラルの場合) を期待された場所で展開したりすることができます

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax

仕様したいオブジェクトや配列にある値を使いたいけど、「オブジェクトや配列としての塊」ではなく個々の値として欲しい時に使われます。

分割代入とスプレッド構文がなぜ辛いと感じるのか

私が理解するのに苦しんだのは以下の点でした。

  1. 分割代入とスプレッド構文は組み合わさって使われることが多い
  2. スプレッド構文と残余引数に使われる「…」が意味合いとして逆の使われ方をしている

もし私と同じように辛いと感じる方でも公式のリファレンスを読むと書いてある事は理解できると思います。しかし、分割代入とスプレッド構文は同時に出てくることが大半でどちらかの使い方から慣れていくという手順が踏めません。

そこで今回は己の理解度を高めるのも兼ねて分割代入とスプレッド構文の課題をそれぞれ分けて問題を作ってみました。簡単な問題ですが、リファレンスを読む場合とまた違うインプットができると思います。

分割代入に関する問題

問 以下のconsoleで何が表示されますか? 

let hoge, poge;
[hoge, poge] = [10, 20];
console.log(hoge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

let hoge;
[hoge] = [10, 20];

console.log(hoge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

let hoge;
[,hoge] = [10, 20];

console.log(hoge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

hoge = [10, 20];

console.log(hoge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

let hoge, poge
[hoge,,poge] = [10, 20, 30, 40, 50];

console.log(poge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

let hoge, poge
[hoge,,poge,] = [10, 20, 30, 40, 50];

console.log(poge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

let hoge, poge
[hoge=3,,poge] = [, 20, 30, 40, 50];
console.log(hoge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

let hoge, poge
[hoge=3,,poge] = [10, 20, 30, 40, 50];
console.log(hoge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

const array = [10,20,30];
[array[2], array[0]] = [array[0], array[2]];
console.log(array);
答えはここをクリック

問 以下のconsoleで何が表示されますか?

const user = {
    hoge: 10,
    poge: 100
};

const {hoge, poge} = user;

console.log(hoge);
console.log(poge);
答えはここをクリック

問  以下のconsoleで何が表示されますか?

const user = {
    hoge: 10,
    poge: 100
};

const {a, b} = user;

console.log(a);
console.log(b);
答えはここをクリック

問 以下のconsoleで何が表示されますか?

const X = {hoge: 100, poge: true};
const {hoge: foo, poge: bar} = X;


console.log(foo);
console.log(bar);
答えはここをクリック

問  以下のconsoleで何が表示されますか?

const X = {hoge: 100, poge: true};
const {hoge: foo, poge: bar} = X;


console.log(hoge);
console.log(poge);
答えはここをクリック

問 以下のconsoleで何が表示されますか?

const {a: hoge, b: poge = 5} = {a: 10};

console.log(hoge);
console.log(poge);
答えはここをクリック

問 以下のconsoleで何が表示されますか?

let X = 'hoge';
let {[X]: foo} = {hoge: 'bar'};

console.log(foo);
答えはここをクリック

問 以下のconsoleで何が表示されますか?

const userHoge = {
  name:'Taro',
  age:20
}

function userId({name}) {
  return name;
}

console.log(userId(userHoge));
答えはここをクリック

問 以下のconsoleで何が表示されますか?

const userHoge = {
  name:'Taro',
  age:20
}

function userId({name:hoge}) {
  return hoge;
}

console.log(userId(userHoge));
答えはここをクリック

問 以下のconsoleで何が表示されますか?

const userHoge = {
  name:'Taro',
  age:20
}

function userId(user) {
  return user.name;
}

console.log(userId(userHoge));
答えはここをクリック

スプレッド構文に関する問題

問 以下のconsoleで何が表示されますか?

let hoge = [0, 1, 2];
let x = 3;
let poge = [...hoge, x];

console.log(poge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

let hoge = {
  name:'Taro',
  age:20,
}

let poge = {...hoge}

console.log(poge)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

function hogeFunc(A,B,C,D,E) {
  console.log(D)
}

let array = [3,4,5]
hogeFunc(1,2,...array)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

function hogeFunc(X,  Y, ...args) {
  console.log(args)
}

hogeFunc(1,2,3,4,5,6)
hogeFunc(1,2,3,4)
答えはここをクリック

問 以下のconsoleで何が表示されますか?

function hogeFunc(X,  Y, ...args) {
  console.log(args[0])
}

hogeFunc("TARO","JIRO",{A:100,B:200},{C:300})
答えはここをクリック

問 以下のconsoleで何が表示されますか?

function hogeFunc(X, ...args,Y) {

  console.log(args[0])
}

hogeFunc("TARO","JIRO",{A:100,B:200},{C:300})
答えはここをクリック

まとめ

皆さん全問正解できたでしょうか?たまに解き直して頂けるとさらに記憶に定着すると思います!

参考文献