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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

Q&A

解決済

4回答

1053閲覧

javascriptのArray.shift()を行うと、GoogleChromeのconsoleにて配列が正しく表示されない

ID_7UGzV8hCHGs5

総合スコア58

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

0グッド

0クリップ

投稿2019/02/06 10:17

編集2019/02/06 11:01

Array.shift()の動きを目視確認しようと思い、
shift()前後の配列の値をGoogleChromeのデベロッパーツールのconsoleに出力しました。

すると、配列の中身が上手く表示されません。

#上手くいくコード: shift()なし

javascript

1 var array1 = ['あああ', 'いいい']; 2 console.log(array1); 3 4 // array1.shift(); 5 // console.log(array1);

イメージ説明

正常に表示された

#上手くいかないコード

javascript

1 var array1 = ['あああ', 'いいい']; 2 console.log(array1); 3 4 array1.shift(); 5 console.log(array1);

イメージ説明

一つ目のconsole.log(array1);の結果から "あああ"が消えてしまっている。

備考:
テストコードは値がシンプルなのでさほど困りませんが、これから多次元配列を扱いたいと思っています。その為、consoleに正しく表示されると 表示されないとデバックが出来なくて困ると思い質問させて頂きました。ご教授下さい。よろしくお願いします。

#追記:
「上手くいかないコード」のコードと実行結果の対応が非常に分かりづらくなってしまっていた為、横に並べてみました。
イメージ説明

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

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

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

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

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

Lhankor_Mhy

2019/02/06 10:44

「一つ目のconsole.log(array1);の結果から "あああ"が消えてしまっている」とのことですが、これは2つ目ではなく、1つ目で間違いないですか?
ID_7UGzV8hCHGs5

2019/02/06 11:07

はい。1つ目で間違いないです。 shift()処理の前に書いてある console.log(array1);の結果から"あああ"が消えてしまっています。
guest

回答4

0

参照

オブジェクトは参照情報なので、console.log() の出力結果てあっても参照出力されます。
(以前、スナップショットを出力されるようGoogle Chromeの仕様変更があった記憶がありますが、いつの間にか、元の仕様に戻ったようですね)

プリミティブ型

プリミティブ型は値出力出来るので、yambejp さんの回答にあるように、JSON.stringify() でString型に変換すれば、簡易的なスナップショットはとれます。
が、全てのObject型に対応しているわけではないので、元のオブジェクトを完全再現する事は出来ません。

ブレークポイント

もう一つの手段として、ブレークポイントを設定すれば、その時点のオブジェクトの状態を得ることが出来ます。
この方法が最も確実だと思います。

Re: ID_7UGzV8hCHGs5 さん

投稿2019/02/06 11:24

編集2019/02/06 11:35
think49

総合スコア18162

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

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

0

ベストアンサー

そういう仕様になっているようです。

【console.log - Web API | MDN】
https://developer.mozilla.org/ja/docs/Web/API/Console/log#Parameters

Chrome や Firefox の比較的新しいバージョンを使っているなら注意が必要です。これらのブラウザで記録されるのはオブジェクトへのリファレンスです。そのため、console.log() を呼び出した時点でのオブジェクトの値が表示されるのではなく、内容を見るために展開させた時点での値が表示されます。

【【Chrome】参照型変数を console.log/dir した時の挙動が怪しい|もっこりJavaScript|ANALOGIC(アナロジック)】
http://analogic.jp/console-dir-log-caution/

1.黒魔術的解決策

js

1'use strict'; 2 3var obj = {name: 'taro'}; 4 5console.log(JSON.parse(JSON.stringify(obj))); 6console.log(JSON.parse(JSON.stringify(obj)));

投稿2019/02/06 11:09

kei344

総合スコア69407

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

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

ID_7UGzV8hCHGs5

2019/02/06 11:16

なるほどですm(__)m リファレンスなんですね。 黒魔術的解決策で無事解決出来ました。ありがとうございます!
guest

0

配列の内容が実際に展開されるまで、中身の表示が遅延されています。
JavaScript - JavaScript Arrayオブジェクトが正しく表示されない|teratail

解決方法は、console.logの際に複製してしまうのが手っ取り早いです。

js

1 var array1 = ['あああ', 'いいい']; 2 console.log([...array1]); 3 4 array1.shift(); 5 console.log(array1);

投稿2019/02/06 11:14

Lhankor_Mhy

総合スコア36106

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

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

oikashinoa

2019/02/06 11:23

軽く見たい時はspreadでばらすのはお手軽で良いですね。
Lhankor_Mhy

2019/02/06 11:29

Object の場合には Object.assign({}, obj) ですね。 とはいえ、両方ともシャローコピーなので、ディープな展開には対応できないという問題はあります。
guest

0

ごめんなさい、質問の意図がわかりません

shift()は配列を破壊的に先頭文字を抜き出す処理です
MDN -
Array.prototype.shift()

一つ目のconsole.log(array1);の結果から "あああ"が消えてしまっている。

は正しい処理ですが、逆にどういう結果を期待しているのでしょうか?

追記

デバッグでさかのぼって参照したいということですか
一度文字列化してオブジェクトに戻せば良いかもしれません

javascript

1var array1 = ['あああ', 'いいい']; 2console.log(JSON.parse(JSON.stringify(array1))); 3array1.shift(); 4console.log(JSON.parse(JSON.stringify(array1)));

投稿2019/02/06 10:36

編集2019/02/06 10:55
yambejp

総合スコア114829

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

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

oikashinoa

2019/02/06 10:46

一つ目のconsole.log()はshift()する前なのに、shift()後の結果が出ているのが質問の意図だとおもいます。 出先なんで試してないですが、私もおかしいのでは?と思いました。
yambejp

2019/02/06 10:58

なるほど、あとから参照すると破壊されたあとのデータが参照されるということですね。 ありがちなのはJSONで処理するとかですかね
ID_7UGzV8hCHGs5

2019/02/06 11:03 編集

皆様回答ありがとうございます。 質問を整理して、新しく追記致しました。 よろしくお願い致します。
ID_7UGzV8hCHGs5

2019/02/06 11:17

ありがとうございました。 「一度文字列化してオブジェクトに戻せば良いかもしれません」 ⇒頂いた書き方で、目的通りの出力になることを確認しました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問