Help us understand the problem. What is going on with this article?

スプレッド演算子を可変長引数に使用した場合、配列になる(スプレッド演算子じゃなくて残余引数?)

More than 1 year has passed since last update.

可変長引数にアクセスすると配列になっている

私用のメモなので、駄文です。


2018/02/06追記
以下の...paramはスプレッド演算子ではなくて残余引数らしいです。
詳しくはコメント参照。

function hoge(...param) { console.log(param); }

function hoge(...param) { console.log(param); }

hoge('1', '2'); // ['1', '2']
hoge(['1', '2']); // [['1', '2']]

上記例でいくと、paramが配列になってます。
なので、引数の1個目にアクセスしたいときはparam[0]って書く必要がある。

スプレッド演算子は配列の要素を展開する役割もあるから困惑して「ん?」ってなりました。
例えば、以下のコードと上記のコードの違いがすぐには分からず戸惑いました。

以下はスプレッド演算子について調査した時に参考にしたこのページより引用しました。
可変長引数が配列になることも記述されています。

const data = [15, -3, 78, 1];
console.log(Math.max(...data));    // 78

// もう以下のように書く必要はありません
console.log(Math.max.apply(null, data));

あれ、Math.max()も引数を配列で受け取ってるの?って思っちゃいました。
冷静になるとそんなわけないですね・・・(実際に引数に配列を渡すとNaNになる)

多分、Math.maxは引数を可変長引数で受け取ってない。
だから、引数は配列になってない。
関数の実態は以下のようになっていて、argumentsでループ回してると推測。

// argsは最初の引数しかアクセスできないけど、arguments[0]の形で引数全てにアクセスできる
function Math.max(args){ do_something(); };

// 引数を可変長配列で受け取っているから、内部スコープでは配列になる
function hoge(...param) { console.log(param); }

論理的な思考が全然できてなかったと反省。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away