質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

Q&A

解決済

3回答

1384閲覧

スプレッド演算子をconsole.logで出力した際の結果

Oskata

総合スコア14

JavaScript

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

0グッド

0クリップ

投稿2018/08/28 10:55

編集2018/08/28 10:57

スプレッド演算子がどのような意味を持つのか調べて見てもよくわからなかったので、
サーバーサイドからJsonで受け取った値をconsole.logで出力しようとしたところ、
splead演算子を使用して出力した場合と、使用せずに出力した場合の結果が変わりませんでした。

console.log({...data}); //[object Object] console.log(data); //[object Object] console.log(JSON.parse(JSON.stringify({...data}))); //{user1:{...}, user2:{...}, ...} console.log(JSON.parse(JSON.stringify(data))); //{user1:{...}, user2:{...}, ...}

スプレッド演算子は配列の中身を展開するという理解でおりますが、
上記のようにconsole.logをしようした場合、なぜスプレッド関数を使わない場合と同じ結果になるのでしょうか。

Javascriptの基礎知識が不足しているので、的外れな質問かもしれないですが
お答え出来る方がおりましたらお願いします。

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

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

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

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

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

guest

回答3

0

複雑に考えすぎなのでは。

JavaScript

1var o = {a: 1}; 2 3console.log(o); // {a: 1} 4console.log({...o}); // {a: 1}

上記コードでは、同じように、オブジェクト初期化子 {} で初期化しているのですから、「プロパティと値の集合体」として見れば、同じになりますよね。
変数 data の中身次第でいかようにも変化しますので、

  • 変数 data に何が入っているのか
  • data.__proto__ === ({}).__proto__ は成立するのか

この辺りを確認してみてはいかがですか。

Re: Oskata さん

投稿2018/08/28 12:07

編集2018/08/28 12:22
think49

総合スコア18162

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

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

0

ベストアンサー

{...data}は新しいオブジェクトを宣言し、dataのキーと値を全てコピーする事が目的です。

JavaScriptのオブジェクト、配列、関数のようなオブジェクトインスタンスの実装は、
メモリ空間上に配置されたアドレス番地で同じものか違うものかを見分けている為、
data === {...data}の結果がfalseになり、新しくオブジェクトを作っている事が確認できます。

JavaScript

1var data = {name: "taro"}; 2console.log(data === data); // true 3console.log(data === {...data}); // false

これの意味は2つあります。

  • オブジェクトの参照を切る(シャローコピー)
  • 別のプロパティを入れたい

JavaScriptのオブジェクトを変数に代入した場合、
変数にはメモリ空間上のアドレス番地が格納されることになります。
なので下記のようにdata2 = data;とした場合、両者には同じメモリ空間上にあるオブジェクトを参照していることになります。

JavaScript

1var data = {name: "taro", age: 18}; 2var data2 = data; 3data2.name = "jiro"; 4console.log(data); // {name: "jiro", age: 18}

これの恐ろしい所は、関数の引数として渡した先で、
引数のオブジェクトのプロパティの値を変えた場合、
関数の呼び出し元にあったはずのオブジェクトが知らぬ内に改変されるという不具合の原因になります。

dataには変更加えたくないんだけどなぁ…という時は下記のように使います。
こうしてコピーを取っておけば誰かが勝手にプロパティを書き換えても元のオブジェクトは変更されていないので安心ですね。

JavaScript

1var data = {name: "taro", age: 18}; 2var data2 = {...data}; 3data2.name = "jiro"; 4console.log(data); // {name: "taro", age: 18}

また、このコードならば下記のように簡略的な書き方も出来ます。
2番目の使い方ですね。

JavaScript

1var data = {name: "taro", age: 18}; 2var data2 = {...data, name: "jiro"}; 3console.log(data); // {name: "taro", age: 18}

投稿2018/08/28 11:19

編集2018/08/28 11:22
miyabi-sun

総合スコア21158

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

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

0

どこでつまっているかわかりませんが
こちらでご理解むずかしいでしょうか?

投稿2018/08/28 11:10

yambejp

総合スコア114814

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問