🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

712閲覧

可変長引数をデフォルト値として使用した場合の処理

HoTo

総合スコア1

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/03/04 08:14

質問

javascriptの例文を見ていて、下記のコードの出力結果が何故答えのようになるのか理解できませんでした。
(x = { ...value })の部分の挙動がイマイチ理解できません。
引数xにはデフォルト値を代入していると思うのですが、引数を変えてみた場合
・{ ...value } ⇒ 20, 20, 20, 40が出力
・{ value } ⇒ NaN, NaN, 20, 40が出力、
・value ⇒ 20, 40, 80, 160が出力
という結果になります。
引数にこれらを取った場合の挙動の違いをご教授頂きたく。

例文の答え:
20, 20, 20, 40

Javascript

1 2const value = { number: 10 }; 3const multiply = (x = { ...value }) => { 4console.log((x.number *= 2)); }; 5 6multiply(); 7multiply(); 8multiply(value); 9multiply(value); 10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

これは可変長引数ではなく、スプレッド構文です。別の形で書けば、(x = Object.assign({}, value))とほぼ同様な、コピーしたオブジェクトを作成しています。

  • (x = { ...value })の場合、デフォルト引数での呼び出しでは毎回コピーしたオブジェクトを書き換えているので、デフォルト引数で何回呼び出しても20のままです。
  • (x = { value })とした場合、xに入るオブジェクトは{ value: { number: 20 } }のようなものになります。x.valueは存在しないのでundefinedで、それを無理やり算術演算するとNaNになります。
  • (x = value)とした場合、コピーではないので、x.number *= 2で元のvalue.numberも書き換わります。

投稿2021/03/04 08:36

編集2021/03/04 08:37
maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HoTo

2021/03/04 08:49

ありがとうございます!! スプレッド構文なるものを知らなかったので混乱しました。。 各パターン丁寧に解説して頂いたのでBAに選ばせて頂きます。
guest

0

{ ...value }はvalueのシャローコピーです。
Object リテラルで使う | スプレッド構文 - JavaScript | MDN

コピーなので、何度呼び出しても、元オブジェクトに影響はないため、20が返ってきます。

引数を渡した場合は、初期値が無視されるため、コピーではないオブジェクトが渡って、元オブジェクトの値が変更されるため、呼び出しごとに倍になります。console.log((x.number *= 2), x===value);として試してみればわかりやすいと思います。

投稿2021/03/04 08:32

編集2021/03/04 08:34
Lhankor_Mhy

総合スコア36946

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HoTo

2021/03/04 08:52

ありがとうございます! ご教示頂いたlogを出してみたところ最初2回がシャローコピーになっていることが良く分かりました! 3回目以降はミュータブルなオブジェクトを引数で渡しているので値が書き換わっていたのですね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問