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

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

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

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

Q&A

解決済

4回答

949閲覧

undefinedについて

syosinsyascript

総合スコア11

JavaScript

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

0グッド

0クリップ

投稿2020/08/25 10:08

編集2020/08/26 04:53

実現したいこと

localstorageの全データをalert内に表示するうえで、未定義なコード(document.inner +=)を正規なコード(確実に使える機能)に書き換えたい。

現状

下記コードのように変数を複数使用してalert表示していて、undefinedが表示されてます。
非定義な変数はvar all なのですが、これに似た代用な正規コードがわかりません。
javascript
alert表示
localstrage
document.inner += の意図(思い付きは)、
for(var i = 1; i < localStorage.length; i++){
var key = localStorage.key(i); //=なので毎回代入・上書きされる
var all = localStorage.getItem(key);//=なので毎回代入・上書きされる }
なので上書きされないよう、document.getElementById('').innerHTML += ;を入れたのですが、alertにidが無い為、getElementById('')を抜いたdocument.inner +=を入れたところ機能していたので安心していたのですが、document.inner += は未定義なためundefinedが表示されます。

上記で述べた様にlocalstrageの全データをalert内に表示し、正規コードを使いalert表示.画像のような形からundefinedを除いている結果を出力したいです。

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

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

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

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

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

m.ts10806

2020/08/25 10:10

>localstorage内のデータ詳細は、key 0 = 太郎;key 1 = あいうえお;key 2 = かきくけこ;となってます。) 本当にそのまま入ってるなら取れるわけがないです。デベロッパツールのキャプチャを提示してください
syosinsyascript

2020/08/25 10:17

失礼しました。localStorageのkeyとvalueを提示したかったのですが、誤解を招く事となりました。修正しております。
m.ts10806

2020/08/25 10:19

デベロッパツールのキャプチャを提示してください。手打ちではミスが起き得ます。
H40831

2020/08/25 13:44

48行目に書いてある document.inner というものが存在しないので、あなたが何をしたいのか想像できなくて、回答者のみなさんが困っていますよ? 存在しないものを表示しようとしているから undefined がでるんです
syosinsyascript

2020/08/25 14:27

私のしたいことは、上記でも書いている様に、undefinedを非表示にしたい事です。そして存在しないものを使って私のしたい事が出来ているのですが、ただundefinedが表示されるのです。総合的に私のしたいことは上記のalertの表示からundefinedを除く事です。説明不足で申し訳ないですが、代用コード又はundefinedの非表示するコードを質問しています。ご存じでしたら、ご教授いただけますか?
H40831

2020/08/25 23:24 編集

私が言った「あなたが何をしたいのか」というのは 「あなたが書いた document.innner というワードは、何をしたくて書いたのか」ということです。 48行目のコードを var all = "\n" + get; に直したら、undefined は表示されなくなると思います。
maisumakun

2020/08/25 23:24

document.innerは何を意図して書いているものですか?
m.ts10806

2020/08/25 23:33

提示された画像はソースコードです。 ソースコードはマークダウンのcode機能で良いのです。 提示してほしいのはLocalstorageの情報。 Chromeでしたら デベロッパツール→Applicationタブ→Local Storage です。
m.ts10806

2020/08/25 23:35

>undefinedを非表示にしたい事 「表示させない」と「解決」は別のものですが、認識問題ないでしょうか。 非表示にしたいだけなら事前でif文で存在チェックをかませば良いだけです。
syosinsyascript

2020/08/26 00:05

document.inner += の意図としては、 for(var i = 1; i < localStorage.length; i++){ var key = localStorage.key(i); //=なので毎回代入・上書きされる var all = localStorage.getItem(key);//=なので毎回代入・上書きされる }なので上書きされないよう、document.getElementById('').innerHTML += ;を入れたのですが、alertにidが無い為、getElementById('')を抜いたdocument.inner +=を入れたところ機能していたので安心していたのですが、undefinedが表示されていることにきずきましてちゃんと定義されたコードをご教示してもらうために質問させていただきました。
syosinsyascript

2020/08/26 00:07

意図ではなく思いつきになります。なのでundefinedがでる理由も理解しています。
m.ts10806

2020/08/26 00:11 編集

>意図ではなく思いつきになります コードは思った通りではなく、書いた通りに動きます。 なので「こんな機能あったらいいな」と雑に書いても動かないのは当然です。 仕様書(ドキュメント・リファレンス)を確認して確実に使える機能を使ってください。
syosinsyascript

2020/08/26 00:25

>コードは思った通りではなく、書いた通りに動きます。 そうですね。確実に使える機能がわからないので質問させてもらってます。
syosinsyascript

2020/08/26 01:00

<「表示させない」と「解決」は別のものですが、認識問題ないでしょうか。 確かにそうですね、解決したいです。しかし解決方法がなければご教示いただいたif文で存在チェックをかませる手段を取ろうと思います。ありがとうございます。
miyabi_takatsuk

2020/08/26 01:11

> undefinedがでる理由も理解しています。 であるならば、 なぜ、 > undefinedを正しい定義(var all),又は非表示(alert内に)のやり方をご教授ください。 の解決方法がわからないのでしょうか? そして、 > 非定義な変数はvar all とありますが、 allは定義されている変数です。 ならば、、、なぜalertにundefinedと表示されるのか、それの解消法の回答を求めている、ということでよろしいですか?
m.ts10806

2020/08/26 01:18

ところで、いつ質問は修正されるのでしょうか。 基本的にこの「質問への追記修正欄」で指摘されたことや聞かれたことは質問本文に反映してもらいたいのですけど。 多くは「質問内容のみ」を見て回答します。 コードは画像で提示され、LocalStorageの正しい情報も提示されない状態でどう答えろというのでしょうか  というのがこちらの本音です。
AkitoshiManabe

2020/08/26 02:54

> >localstorage内のデータ詳細は、key 0 = 太郎;key 1 = あいうえお;key 2 = かきくけこ;となってます。) ディベロッパーツールのキャプチャ(Applicationタブの Local Storage で表示される内容)を示してください。
H40831

2020/08/26 04:54

48行目のコードを var all = "\n" + get; に直したら、undefined は表示されなくなるのですが、それじゃダメなんですか?
syosinsyascript

2020/08/26 05:06

>undefined は表示されなくなるのですが、それじゃダメなんですか? 確かに表示は消えるのですが、allの値がlocalstorageの最後の値だけになるので(上書きされるため?)違う物を探しております。説明ができなくて申し訳ないです。
H40831

2020/08/26 05:16

ああ、そのコメントで、やっと何が問題なのか把握できました
syosinsyascript

2020/08/26 05:29

頭を悩ますコメントばかりで申し訳ないです。何が分からないのか分からない状態でして、状況の説明もままならないド素人な為、お世話おかけしております。
miyabi_takatsuk

2020/08/26 05:34

変数宣言、代入、四則演算、文字列連結、 と、そこらへんを理解していかないと、解決しないと思いますよ。 (JavaScriptというか、プログラミングの基本)
m.ts10806

2020/08/26 06:05

前の質問で回答に書いた「ループと変数の基本部分で間違えています。」というアドバイスが全く活きていないことが分かりました。 まぁ役に立たないと思うのは勝手ですが、同じような指摘をずっとされ続けていて何も思うところがないのでしたら、成長の余地はなさそうですね。
syosinsyascript

2020/08/26 06:35

m.ts10806さんのコメントやアドバイスは毎度有難く頂いていますし勉強させてもらっています。勉強が足りていないのは自分でも承知しておりますし、毎度質問させていただく度に痛感しております。 今後と無いよう精進します。
guest

回答4

0

document.inner

JavaScript

1var all = document.inner += "\n" + get;

そもそも、document.inner なるプロパティは存在しません。

JavaScript

1console.log('inner' in document); // false

将来的に inner プロパティが実装される可能性を踏まえると、新しいプロパティを独自拡張すべきではありません。

WeakMap

どうしても、document に紐付けしたいのであれば、WeakMapを使用して下さい。

JavaScript

1const inner = new WeakMap([[document, 'あいうえお']]); 2 3console.log(inner.get(document)); // "あいうえお"

Re: syosinsyascript さん

投稿2020/08/25 12:47

編集2020/08/25 12:51
think49

総合スコア18189

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

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

syosinsyascript

2020/08/25 13:15

いろんな物があるのですね。weakmap勉強してみます。ありがとうございます。ただ私はdocumentと紐付けたいわけでなく、alert内にlocalstrageの全データを改行して表示したいのですが、どうもalert内に"undefined"が出現しますので質問させていただきました。weakmapはalert内にlocalstrageの全データを改行して表示できますか?もしご存じでしたらご教授ください。お願いします。
miyabi_takatsuk

2020/08/25 15:20

横槍失礼します。 > weakmapはalert内にlocalstrageの全データを改行して表示できますか? 本件から離れるので、別質問にした方がいいですよ。 ただ、本質問で、みなさんが言われていることは(質問修正依頼のコメント含め)、基本も含めて、しっかり理解すべき内容なので、 よく参照してください。 (でないと、次の質問も同じ様な事を言われる結果になりそう。)
think49

2020/08/25 23:23 編集

To: syosinsyascript さん > どうもalert内に"undefined"が出現します ですから、「document.innerが存在しないこと」が原因と指摘しているのですが…。 > weakmapはalert内にlocalstrageの全データを改行して表示できますか? 出来ません。 WeakMapについては、回答で示したMDNを読んで下さい。 --- そもそも、document.inner += で代入しているのは、どういう意図ですか? 何がしかの理由があって、代入しているのではないのですか。
think49

2020/08/25 23:32 編集

私の指摘は、H40831 さん、maisumakun さんの指摘と同様です。 私はあなたが何がしかの狙いがあって、document.innerを使用している前提で回答しました。 もしも、何もわからないままに、わからないコードを書いているとしたら、「コードの動きを理解すること」が第一にすべき作業と考えます。
syosinsyascript

2020/08/26 00:11

おっしゃる通りです。しっかり勉強します。
think49

2020/08/26 03:47 編集

部分的に返答すると伝わらないので、止めた方が良いです。 結局のところ、document.innerに意図はなく、コードの意味がわからない状態で書いていたのですか。 あるいは、どこかのサイトでサンプルコードを持ってきただけとかですか。 https://teratail.com/questions/286894 のm.ts10806さんの回答コードに document.inner+= を追加したのは分かるんですが。
guest

0

順番に解説しますと、
まず、 document.inner が空なのが undefined が表示される原因なので、
document.inner をundefinedではなく、空の文字列にしておきます。

document.inner = ''; function his(){ var key = 0; var name = localStorage.getItem(key); var data = parseInt(localStorage.length) - parseInt(1); for(var i = 1; i < localStorage.length; i++){ var get = localStorage.getItem(localStorage.key(i)); var all = document.inner += "\n" + get; } alert("name :" + name + "\n\n" + "counts :" + data + all); localStorage.reload(); }

これで、undefinedは表示されなくなります。

しかし、特に意味もなくdocument.inner を使っているのなら、わかりやすい名前の変数に変えましょう。
ここではallにしておきます。

var all = ''; function his(){ var key = 0; var name = localStorage.getItem(key); var data = parseInt(localStorage.length) - parseInt(1); for(var i = 1; i < localStorage.length; i++){ var get = localStorage.getItem(localStorage.key(i)); var all = all += "\n" + get; } alert("name :" + name + "\n\n" + "counts :" + data + all); localStorage.reload(); }

こうすると、var all = all += "\n" + get;という一文に無駄な記述があることに気づきますので、
all += "\n" + get; にしましょう。

var all = ''; function his(){ var key = 0; var name = localStorage.getItem(key); var data = parseInt(localStorage.length) - parseInt(1); for(var i = 1; i < localStorage.length; i++){ var get = localStorage.getItem(localStorage.key(i)); all += "\n" + get; } alert("name :" + name + "\n\n" + "counts :" + data + all); localStorage.reload(); }

これでお望みの結果になったのではないでしょうか?

投稿2020/08/26 05:52

H40831

総合スコア975

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

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

syosinsyascript

2020/08/26 06:21

なるほど、コードをみるとうなずけるのですが自分で考えるとなるとチンプンカンプンになってしまいます。 説明やコメントなど親切に取り合っていただきありがとうございます。
H40831

2020/08/26 10:11 編集

前回の質問など閲覧してないので、どのような学習方法でされているか存じませんが、 もし、そのときそのときに必要になった知識だけ学んでいるようなら、大事なところが欠けますので 流れに一貫性のある資料でひととおり学ぶことをオススメします
guest

0

他の方がおっしゃる通り、document.innerというものは存在しないので、
出力する際、undefinedとなることはご理解いただけたでしょうか?
では、なぜ、all変数には、"undefined"(あえてクォーテーションで文字列として扱う)
が格納されているのか。
(もちろん他の文字も格納されているが、省略)

それは、
var all = document.inner += '\n' + get;は、文字列連結になっているからです。
JavaScriptは動的型付けのため、
異型のデータを連結する際、一つの型に丸めて連結される性質があります。
例えば、下記のような現象が起きます。

javascript

1const a = 1 + 2; // 3 2const b = '1' + 2; // "12"

というようになります。
すなわち今回の場合、
document.innerは、未定義のため、文字列連結をする際、
"undefined"という文字列として連結されます。
よって、allには、"undefined\n" + getの値というデータが格納されることになります。

なので、allが未定義状態なのではなく、
単純に、未定義の値(undefined)が文字列連結された文字列データallに入っていて、
それがalertで表示されていただけということです。

では、どうすれば、未定義変数だった場合は、空文字(非表示)とすることができるかというと、
変数の存在可否は、typeofキーワードを使うのが、単純でやりやすいのかな、と思います。

javascript

1const a = typeof hoge == 'undefined' ? '' : hoge;

他にも、新しい構文で、null合体演算子というものもありますので、
そちらも使えるかと。
(これは、左辺がnullundefinedでなければそのまま左辺、そうだったら右辺の値を使うという演算子)

javascript

1const obj = {}; 2const a = obj.inner ?? ''; // ''

変数にどんなデータが入っているかはプログラミングにおいては、とても大事なことになりますので、
よくよく学習されてください。

投稿2020/08/26 01:42

miyabi_takatsuk

総合スコア9555

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

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

syosinsyascript

2020/08/26 05:21

すごくわかりやすいです。ありがとうございます。document.innerが未定義な為それの文字列としてundefinedが表示されるということですね。気になる点があるのですが、文字列として認識しているはずなのにdocument.inner += を外すとallの値が上書きされてstorageの最後の値のみ出力されます。それはどれで反応しているのか分かりますか?
miyabi_takatsuk

2020/08/26 05:36 編集

そりゃそうですよ、 "\n" + getと続いてるので、 "\n"とgetに格納されているstrageの値が文字列として、allに格納されるからです。
miyabi_takatsuk

2020/08/26 05:28

代入演算に関しても、もっと理解深めてください。
syosinsyascript

2020/08/26 05:35

そうですね。全体的に理解を深めたいと思います。説明や回答を親切にありがとうございます。
guest

0

ベストアンサー

おそらくdocument.innerundefinedで、それがそのまま表示されているように思えます。

undefinedを正しい定義(var data),又は非表示(alert内に)のやり方をご教授ください

document.innerが本来何を意図した値なのか不明なので非表示にする方法だけ紹介します。
単純に三項演算子を使った方法です。

javascript

1var data = (document.inner? document.inner : "") + "\n" + "あいうえお";

投稿2020/08/25 10:14

nekoniki

総合スコア2411

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

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

syosinsyascript

2020/08/25 12:35

(document.inner? document.inner : "")を使って色々やってみましたが、うまく機能しませんでした。 三項演算子について調べてみます。ありがとうございます。
syosinsyascript

2020/08/25 13:32

又、もしdocument.innerの様に反応するような代用コードを存じてましたらご教授いただけますか?お願いします。
maisumakun

2020/08/26 00:24

forループの外側でvar all = '';を宣言して、ループ内ではall+=としていく、という形ではだめでしょうか?
m.ts10806

2020/08/26 01:19

私も単純な文字列に追記の形ではダメな理由が分かりません。
syosinsyascript

2020/08/26 06:03

>forループの外側でvar all = '';を宣言して、ループ内ではall+=としていく、という形ではだめでしょうか? 本当ですね、すっかりやりたいことが出来ました。皆様、お騒がせしてすみません。しっかりと色々と理解を深めます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問